/* Return the current time as a signed 64-bit number of seconds since midnight, 1 January 1904. This is apparently when the Macintosh was designed. */ int macTime(int *hi, unsigned *lo) { unsigned long diff; /* Not time_t */ time_t macEpoch, current; struct tm tm; tm.tm_sec = 0; tm.tm_min = 0; tm.tm_hour = 0; tm.tm_mday = 1; tm.tm_mon = 1; tm.tm_year = 4; tm.tm_isdst = -1; macEpoch = mktime_gmt(&tm); if(macEpoch < 0) return -1; current = time(NULL); if(current < 0) return -1; if(current < macEpoch) { errno = EINVAL; return -1; } diff = current - macEpoch; #if INT_MAX == LONG_MAX *hi = 0; #else *hi = diff >> 32; #endif *lo = diff & 0xFFFFFFFF; return 0; }
//-----------------------------------------------------------------// time_t mktime(const struct tm *tmp) { time_t t = mktime_gmt(tmp); // GMT からの偏差(-9時間) t -= (time_t)timezone_offset_ * 3600; return t; }
int parse_time(const char *buf, int offset, int len, time_t * time_return) { struct tm tm; time_t t; int i = offset; i = skip_word(buf, i, len); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; if (i >= len) return -1; if (d2i(buf[i]) >= 0) { i = parse_int(buf, i, len, &tm.tm_mday); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_month(buf, i, len, &tm.tm_mon); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_year); if (i < 0) return -1; if (tm.tm_year < 100) tm.tm_year += 1900; if (tm.tm_year < 1937) tm.tm_year += 100; if (tm.tm_year < 1937) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_hour); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_min); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_sec); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = skip_word(buf, i, len); if (i < 0) return -1; } else { i = parse_month(buf, i, len, &tm.tm_mon); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_mday); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_hour); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_min); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_sec); if (i < 0) return -1; i = skip_separator(buf, i, len); if (i < 0) return -1; i = parse_int(buf, i, len, &tm.tm_year); if (i < 0) return -1; if (tm.tm_year < 100) tm.tm_year += 1900; if (tm.tm_year < 1937) tm.tm_year += 100; if (tm.tm_year < 1937 || tm.tm_year > 2040) return -1; } if (tm.tm_year < 2038) { tm.tm_year -= 1900; tm.tm_isdst = -1; t = mktime_gmt(&tm); if (t == -1) return -1; } else { t = time_t_max; } *time_return = t; return i; }