将 ISO8601 日期格式转换为当地时间 (iOS)

Converting ISO8601 Date Format to local time (iOS)

所以在 Web 应用程序上有一个部分,用户可以在其中输入事件,Web 服务以下列格式将这些事件发送到移动应用程序:

"yyyy-MM-dd'T'HH:mm:ssZZZZZ"

我在尝试将字符串转换为日期时遇到问题,这样我就可以从事件中获取时间(也以正确的时区格式化),例如,这里是“2015-03 -20T20:00:00-07:00”,当我拉出时间时应该是太平洋时间下午 1 点。但是我得到的是晚上 8 点或凌晨 3 点(取决于我是否将 UTC 缩写添加到日期格式化程序)。

这是我目前所拥有的,我知道我在这里遗漏了一些东西,也许还需要使用另一个日期格式化程序,但到目前为止我还不知道我哪里出错了。

NSString *datePattern = @"yyyy-MM-dd'T'HH:mm:ssZZZZZ";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:datePattern];
NSString *sString = [valueDict valueForKey:@"start_date"];
NSDate *startDate = [dateFormatter dateFromString:sString];
NSDateFormatter *timeFormatter = [NSDateFormatter new];
[timeFormatter setDateFormat:@"hh:mm a"];
[timeFormatter setLocale:[NSLocale systemLocale]];
NSString *timeString = [timeFormatter stringFromDate:startDate];

2015-03-20T20:00:00-07:00 太平洋夏令时间晚上 8 点。

如果您代表太平洋夏令时间下午 1 点,那就是

  • 2015-03-20T13:00:00-07:00

或在"Zulu"中表示(即GMT/UTC)

  • 2015-03-20T20:00:00Z

使用网络服务时,后者是 ISO 8601 日期的通用约定。然后,当您将其呈现给用户时,您会在他们的本地时区将其呈现给他们(使用具有默认 timeZone 设置的 NSDateFormatter


请注意,在使用 NSDateFormatter 准备 ISO 8601 日期时,您需要确保指定 en_US_POSIXlocale,如 Technical Q&A QA1480 中所述。在为美国受众设计应用程序时,这并不重要,但这是最佳做法,以防用户未在其设备上使用公历。