summaryrefslogtreecommitdiff
path: root/source/dng_date_time.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/dng_date_time.cpp')
-rw-r--r--source/dng_date_time.cpp54
1 files changed, 33 insertions, 21 deletions
diff --git a/source/dng_date_time.cpp b/source/dng_date_time.cpp
index bede131..b143181 100644
--- a/source/dng_date_time.cpp
+++ b/source/dng_date_time.cpp
@@ -806,32 +806,44 @@ dng_time_zone LocalTimeZone (const dng_date_time &dt)
#if qMacOS
CFTimeZoneRef zoneRef = CFTimeZoneCopyDefault ();
-
+
+ CFReleaseHelper<CFTimeZoneRef> zoneRefDeleter (zoneRef);
+
if (zoneRef)
{
-
- CFGregorianDate gregDate;
- gregDate.year = dt.fYear;
- gregDate.month = (SInt8) dt.fMonth;
- gregDate.day = (SInt8) dt.fDay;
- gregDate.hour = (SInt8) dt.fHour;
- gregDate.minute = (SInt8) dt.fMinute;
- gregDate.second = (SInt8) dt.fSecond;
-
- CFAbsoluteTime absTime = CFGregorianDateGetAbsoluteTime (gregDate, zoneRef);
-
- CFTimeInterval secondsDelta = CFTimeZoneGetSecondsFromGMT (zoneRef, absTime);
-
- CFRelease (zoneRef);
-
- result.SetOffsetSeconds (Round_int32 (secondsDelta));
-
- if (result.IsValid ())
+ // New path that doesn't use deprecated CFGregorian-based APIs.
+
+ CFCalendarRef calendar =
+ CFCalendarCreateWithIdentifier (kCFAllocatorDefault,
+ kCFGregorianCalendar);
+
+ CFReleaseHelper<CFCalendarRef> calendarDeleter (calendar);
+
+ CFAbsoluteTime absTime;
+
+ if (CFCalendarComposeAbsoluteTime (calendar,
+ &absTime,
+ "yMdHms",
+ dt.fYear,
+ dt.fMonth,
+ dt.fDay,
+ dt.fHour,
+ dt.fMinute,
+ dt.fSecond))
{
- return result;
+
+ CFTimeInterval secondsDelta = CFTimeZoneGetSecondsFromGMT (zoneRef, absTime);
+
+ result.SetOffsetSeconds (Round_int32 (secondsDelta));
+
+ if (result.IsValid ())
+ {
+ return result;
+ }
+
}
-
+
}
#endif