APR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, apr_time_t *aprtime) { /* TODO: Consider not passing in pointer to apr_time_t (e.g., call by value) */ AprTimeToFileTime(*ostime, *aprtime); return APR_SUCCESS; }
APR_DECLARE(apr_status_t) apr_time_exp_gmt(apr_time_exp_t *result, apr_time_t input) { FILETIME ft; SYSTEMTIME st; AprTimeToFileTime(&ft, input); FileTimeToSystemTime(&ft, &st); /* The Platform SDK documents that SYSTEMTIME/FILETIME are * generally UTC, so no timezone info needed */ SystemTimeToAprExpTime(result, &st); result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); return APR_SUCCESS; }
APR_DECLARE(apr_status_t) apr_time_exp_tz(apr_time_exp_t *result, apr_time_t input, apr_int32_t offs) { FILETIME ft; SYSTEMTIME st; AprTimeToFileTime(&ft, input + (offs * APR_USEC_PER_SEC)); FileTimeToSystemTime(&ft, &st); /* The Platform SDK documents that SYSTEMTIME/FILETIME are * generally UTC, so we will simply note the offs used. */ SystemTimeToAprExpTime(result, &st); result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); result->tm_gmtoff = offs; return APR_SUCCESS; }
void CLogEntryData::InitDateStrings() const { if (tmDate == 0) { sDate = "(no date)"; } else { TCHAR date_native[SVN_DATE_BUFFER] = {0}; FILETIME ft = {0}; AprTimeToFileTime (&ft, tmDate * 1000000L); SVN::formatDate (date_native, ft); sDate = CUnicodeUtils::StdGetUTF8 (date_native); } }
APR_DECLARE(apr_status_t) apr_time_exp_lt(apr_time_exp_t *result, apr_time_t input) { SYSTEMTIME st; FILETIME ft, localft; AprTimeToFileTime(&ft, input); #if APR_HAS_UNICODE_FS && !defined(_WIN32_WCE) IF_WIN_OS_IS_UNICODE { TIME_ZONE_INFORMATION *tz; SYSTEMTIME localst; apr_time_t localtime; get_local_timezone(&tz); FileTimeToSystemTime(&ft, &st); /* The Platform SDK documents that SYSTEMTIME/FILETIME are * generally UTC. We use SystemTimeToTzSpecificLocalTime * because FileTimeToLocalFileFime is documented that the * resulting time local file time would have DST relative * to the *present* date, not the date converted. */ SystemTimeToTzSpecificLocalTime(tz, &st, &localst); SystemTimeToAprExpTime(result, &localst); result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); /* Recover the resulting time as an apr time and use the * delta for gmtoff in seconds (and ignore msec rounding) */ SystemTimeToFileTime(&localst, &localft); FileTimeToAprTime(&localtime, &localft); result->tm_gmtoff = (int)apr_time_sec(localtime) - (int)apr_time_sec(input); /* To compute the dst flag, we compare the expected * local (standard) timezone bias to the delta. * [Note, in war time or double daylight time the * resulting tm_isdst is, desireably, 2 hours] */ result->tm_isdst = (result->tm_gmtoff / 3600) - (-(tz->Bias + tz->StandardBias) / 60); } #endif #if APR_HAS_ANSI_FS || defined(_WIN32_WCE) ELSE_WIN_OS_IS_ANSI { TIME_ZONE_INFORMATION tz; /* XXX: This code is simply *wrong*. The time converted will always * map to the *now current* status of daylight savings time. */ FileTimeToLocalFileTime(&ft, &localft); FileTimeToSystemTime(&localft, &st); SystemTimeToAprExpTime(result, &st); result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); switch (GetTimeZoneInformation(&tz)) { case TIME_ZONE_ID_UNKNOWN: result->tm_isdst = 0; /* Bias = UTC - local time in minutes * tm_gmtoff is seconds east of UTC */ result->tm_gmtoff = tz.Bias * -60; break; case TIME_ZONE_ID_STANDARD: result->tm_isdst = 0; result->tm_gmtoff = (tz.Bias + tz.StandardBias) * -60; break; case TIME_ZONE_ID_DAYLIGHT: result->tm_isdst = 1; result->tm_gmtoff = (tz.Bias + tz.DaylightBias) * -60; break; default: /* noop */; } } #endif return APR_SUCCESS; }