X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/bac41a7b9a0a9254fa30f8bb6e6038ab71a483e2..67c7378dcb8de24c86b7fedff90b4b496f2e474c:/Keychain/cssmdatetime.cpp?ds=sidebyside diff --git a/Keychain/cssmdatetime.cpp b/Keychain/cssmdatetime.cpp index 980f0234..22d5c1cd 100644 --- a/Keychain/cssmdatetime.cpp +++ b/Keychain/cssmdatetime.cpp @@ -42,6 +42,7 @@ #include #include #include +#include namespace Security { @@ -219,9 +220,15 @@ TimeStringToMacLongDateTime (const CSSM_DATA &inUTCTime, SInt64 &outMacDate) //tmp->tm_sec = x; date.second = x; - CFTimeZoneRef timeZone = CFTimeZoneCopyDefault(); + CFTimeZoneRef timeZone = CFTimeZoneCreateWithTimeIntervalFromGMT(NULL, 0); CFAbsoluteTime absTime = CFGregorianDateGetAbsoluteTime(date, timeZone); CFRelease(timeZone); + + // Adjust abstime to local timezone + timeZone = CFTimeZoneCopyDefault(); + absTime += CFTimeZoneGetSecondsFromGMT(timeZone, absTime); + CFRelease(timeZone); + outMacDate = SInt64(double(absTime + kCFAbsoluteTimeIntervalSince1904)); } @@ -234,8 +241,15 @@ void MacSecondsToTimeString(UInt32 inMacDate, UInt32 inLength, void *outData) void MacLongDateTimeToTimeString(const SInt64 &inMacDate, UInt32 inLength, void *outData) { + // @@@ this code is close, but on the fringe case of a daylight savings time it will be off for a little while CFAbsoluteTime absTime = inMacDate - kCFAbsoluteTimeIntervalSince1904; + + // Remove local timezone component from absTime CFTimeZoneRef timeZone = CFTimeZoneCopyDefault(); + absTime -= CFTimeZoneGetSecondsFromGMT(timeZone, absTime); + CFRelease(timeZone); + + timeZone = CFTimeZoneCreateWithTimeIntervalFromGMT(NULL, 0); CFGregorianDate date = CFAbsoluteTimeGetGregorianDate(absTime, timeZone); CFRelease(timeZone);