【问题标题】:How to get/convert UTC date from local Date in OSX?如何从 OSX 中的本地日期获取/转换 UTC 日期?
【发布时间】:2014-11-11 10:03:05
【问题描述】:

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

这是我使用的代码:

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

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

更新:

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

【问题讨论】:

    标签: objective-c macos nsdate nstimeinterval nstimezone


    【解决方案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];
    

    【讨论】:

    • 我从 plist 中读取 localDate: /Library/Receipts/InstallHistory.plist 并且显示正确
    • 一个 NSDate 只是包装自 1970 年以来的秒数。它是 UTC。仅当您创建它时才会有问题.. 但那是在创建时
    • 它将日期存储在我的本地区域中,并且在调试时它会像 plist 中一样正确读取:dropbox.com/s/3pc178avr4pj7uj/1.png?dl=0
    【解决方案2】:

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

    <key>date</key>
    <date>2014-07-08T09:30:15Z</date>
    

    这是“2014-07-08 09:30:15 UTC”。因此

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

    应该包含正确的日期,无需为您当地的情况进行调整 时区。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多