RTDECL(PRTTIME) RTTimeLocalExplode(PRTTIME pTime, PCRTTIMESPEC pTimeSpec) { pTime = RTTimeExplode(pTime, pTimeSpec); if (pTime) { pTime->fFlags = (pTime->fFlags & ~RTTIME_FLAGS_TYPE_MASK) | RTTIME_FLAGS_TYPE_LOCAL; pTime->offZone = RTTimeLocalDeltaNano() / (UINT64_C(1000000000)*3600); /** @todo this is obviously wrong. Need RTTimeLocalDeltaNanoFor(pTimeSpec); */ } return pTime; }
RTDECL(PRTTIME) RTTimeLocalExplode(PRTTIME pTime, PCRTTIMESPEC pTimeSpec) { /* * FileTimeToLocalFileTime does not do the right thing, so we'll have * to convert to system time and SystemTimeToTzSpecificLocalTime instead. */ RTTIMESPEC LocalTime; SYSTEMTIME SystemTimeIn; FILETIME FileTime; if (FileTimeToSystemTime(RTTimeSpecGetNtFileTime(pTimeSpec, &FileTime), &SystemTimeIn)) { SYSTEMTIME SystemTimeOut; if (SystemTimeToTzSpecificLocalTime(NULL /* use current TZI */, &SystemTimeIn, &SystemTimeOut)) { if (SystemTimeToFileTime(&SystemTimeOut, &FileTime)) { RTTimeSpecSetNtFileTime(&LocalTime, &FileTime); pTime = RTTimeExplode(pTime, &LocalTime); if (pTime) pTime->fFlags = (pTime->fFlags & ~RTTIME_FLAGS_TYPE_MASK) | RTTIME_FLAGS_TYPE_LOCAL; return pTime; } } } /* * The fallback is to use the current offset. * (A better fallback would be to use the offset of the same time of the year.) */ LocalTime = *pTimeSpec; RTTimeSpecAddNano(&LocalTime, RTTimeLocalDeltaNano()); pTime = RTTimeExplode(pTime, &LocalTime); if (pTime) pTime->fFlags = (pTime->fFlags & ~RTTIME_FLAGS_TYPE_MASK) | RTTIME_FLAGS_TYPE_LOCAL; return pTime; }