在iOS中解析日期/时间:如何处理(或不处理)时区?

时间:2011-04-05 23:44:07

标签: objective-c ios nsdate nsdateformatter

我有一个ASP.NET MVC 3网站,通过JSON与我的iOS应用程序通信。作为JSON响应中发送的对象的一部分,我的日期格式为yyyy-MM-dd HH:mm:ss ZZZ,输出2011-04-05 16:28:22 -07:00。我如何在iOS中解析它?

这是我现在正在搞乱的代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSDate *date = [dateFormatter dateFromString:@"2011-04-05T16:28:22-0700"];

NSLog(@"%@; %@; %@", dateFormatter, date, [NSTimeZone localTimeZone]);

首先要注意的是2011-04-05 16:28:22 -07:00必须看起来像2011-04-05T16:28:22-0700,其中T替换第一个空格(假设代表时间,或者字符串的时间部分)从?)开始,删除第二个空格并删除时区中的冒号。我想我会找到一种方法来格式化.NET发回的字符串,以符合iOS将解析的字符串。

真正的问题是输出的日期比我在JSON响应中发送的日期提前了7个小时。因此,iOS将2011-04-05 16:28:22 -07:00输出为2011-04-05 23:28:22 +0000,就我的应用而言,这是错误的。

我到目前为止找到的唯一解决方案是将JSON中的日期发送为2011-04-05 16:28:22 +00:00,但这又是错误的,因为我正在改变实际日期应该是什么。

无论如何,我很感激有人看一看,让我知道如何解析日期字符串.NET正在通过格式yyyy-MM-dd HH:mm:ss ZZZ输出(我想这可以重写为yyyy-MM-ddTHH:mm:ssZZZ })我可以在iOS中使用的NSDate对象。

3 个答案:

答案 0 :(得分:14)

我不知道这是多么正确,但我最终发现在.NET中我必须做DateTime.ToUniversalTime().ToString("yyyy-MM-ddHH:mm:ss")而在iOS方面我必须这样做:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"];
NSDate *date = [dateFormatter dateFromString:@"2011-04-0600:28:27"];

只有在NSLog输出时日期才正确,所以我假设我终于得到了一个合适的日期/时间。

答案 1 :(得分:6)

您的iOS日期解析代码是正确的:2011-04-05 16:28:22 -07:002011-04-05 23:28:22 +0000代表同一时间,只是在不同的时区。您唯一的问题是NSDate实际上并不存储时区,因此[date description]使用UTC输出。

答案 2 :(得分:2)

几乎可以肯定的是,只需在任何地方使用UTC时间进行交换而不打扰时区。我相信你可以得到你的ASP.NET代码来做到这一点,并且在接收端也更容易解析。 NSDateFormatter使用标准的Unicode日期格式语法,您可以阅读here