如何在OSX中从本地日期获取/转换UTC日期?

时间:2014-09-17 11:30:00

标签: objective-c macos nsdate nstimeinterval nstimezone

我需要通过指定的NSDate获取UTC日期。 问题是如果日期是在夏令时期间,utcDate无法正确计算。

这是我使用的代码:

NSDate *localDate = [updatesInfo objectForKey:@"date"];

NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
NSDate *utcDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

UPD:

我从/Library/Receipts/InstallHistory.plist读取localDate它是一个OSX文件,其中包含所有应用程序的安装历史记录。 https://www.dropbox.com/s/3pc178avr4pj7uj/1.png?dl=0

2 个答案:

答案 0 :(得分:1)

NSDate 是UTC中的。总是。

您发布的代码似乎表明您的" updatesInfo"包含不正确的NSDate。或者至少你认为它包含不正确的日期。

您在创建日期时可能犯了错误。作为部分解决方法,您可以尝试使用secondsFromGMTForDate:这在大多数时间都是正确的,除了非常接近DST更改点的某些日期(因为您的日期不正确)。你可以改进:

NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMTForDate:localDate];
NSDate* betterDate = [localDate dateByAddingTimeInterval: -timeZoneOffset];
timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMTForDate:betterDate];
NSDate* utcDate = [localDate dateByAddingTimeInterval: -timeZoneOffset];

答案 1 :(得分:0)

属性列表文件以UTC格式存储日期。如果以纯文本格式打开文件 编辑器你会看到像

这样的东西
<key>date</key>
<date>2014-07-08T09:30:15Z</date>

这是&#34; 2014-07-08 09:30:15 UTC&#34;。因此

NSDate *date = [updatesInfo objectForKey:@"date"];

应包含正确的日期,无需为您的本地调整 时区。

但请注意,Xcode属性列表编辑器根据您的本地时区显示存储在属性列表文件中的日期。如果您在Xcode中编辑日期字段, 它将被翻译回UTC以存储在plist文件中。