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

时间:2015-03-17 04:33:50

标签: ios nsdate nsdateformatter utc

因此,有一个关于Web应用程序的部分,用户可以将事件输入,并且Web服务以下列格式将这些事件发送到移动应用程序:

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

我在尝试将字符串转换为日期时遇到问题,因此我可以从事件中获取时间(也以正确的时区格式化),所以例如这里有一个来自" 2015-03-20T20:00:00-07:00",当我抽出时间应该是太平洋时间下午1点。但我要么得到8PM或3AM(取决于我是否将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];

1 个答案:

答案 0 :(得分:1)

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

如果您代表PDT的下午1点,那么

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

或代表" Zulu" (即GMT / UTC)

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

使用Web服务时,后者是ISO 8601日期的通用约定。然后,当您将其呈现给用户时,您可以在当地时区将其呈现给他们(使用NSDateFormatter及其默认timeZone设置。


注意,使用NSDateFormatter准备ISO 8601日期时,您需要确保按照Technical Q&A QA1480中的说明指定locale en_US_POSIX。在为美国观众设计应用程序时,这并不重要,但如果用户未在其设备上使用格里高利历,这是最佳做法。