/*
* このルーチンは、ISO 8601 書式の時間表記を、UTC 1970 年 1 月 1 日 00:00:00
* からの経過秒数を示すティック数へ変換します。
* このティックはローカル時間に調整されます。
*/ int from_iso8601_time(char *buf, time_t *tick_out)
{
int year, month, day, hour, min, sec;
struct tm time_str;
sscanf(buf, "%4d%2d%2dT%2d%2d%2dZ",
&year, &month, &day, &hour, &min, &sec);
time_str.tm_year = year - 1900;
time_str.tm_mon = month - 1;
time_str.tm_mday = day;
time_str.tm_hour = hour;
time_str.tm_min = min;
time_str.tm_sec = sec;
time_str.tm_isdst = -1;
*tick_out = mktime(&time_str);
if (*tick_out != (long)-1) {
/* ローカル・タイムゾーンに調整 */
if (time_str.tm_isdst == 0)
*tick_out -= timezone;
else
*tick_out -= altzone;
return(0);
} else
return(-1);
}
/*
* このルーチンは、UTC 1970 年 1 月 1 日 00:00:00 からの経過秒数を示すティック数を、
* ISO 8601 書式の時間表記へ変換します。
*/
int
to_iso8601_time(time_t tick, char *buf_out)
{
struct tm time_str;
if (gmtime_r(&tick, &time_str)) {
/* 書式文字列が固定幅 (ゼロで埋め込み) フィールドを強制する。 */
sprintf(buf_out, "%04d%02d%02dT%02d%02d%02dZ",
time_str.tm_year + 1900,
time_str.tm_mon + 1,
time_str.tm_mday,
time_str.tm_hour,
time_str.tm_min,
time_str.tm_sec);
return (0);
} else {
return (-1);
}
}
|