2011-04-05 94 views
16

我有一个ASP.NET MVC 3网站,通过JSON与我的iOS应用进行通信。作为在JSON响应中发送的对象的一部分,我的日期格式为yyyy-MM-dd HH:mm:ss ZZZ,它输出2011-04-05 16:28:22 -07:00。我如何解析在iOS中?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:002011-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)输出到NSDate对象我可以在iOS中使用。

+0

当你谈论iOS输出时,你的意思是NSLog?如果是这样,NSLog总是默认输出GMT。所以,你的代码没有问题。 – 2011-04-05 23:54:11

+0

是的,这就是我所指的。但是如果'NSLog'输出在格林尼治标准时间什么说'UILabel'输出? – Gup3rSuR4c 2011-04-05 23:59:54

+0

NSDate将时间存储为GMT。显示任何日期时,您必须使用[NSDateFormatter](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html)-stringFromDate方法串。 NSDateFormatter也默认为当前时区。 – 2011-04-06 00:13:23

回答

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输出时,所以我假设我终于得到了适当的日期/时间。

2

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

+0

我看到,我已经改变了.NET的一面输出世界时,但我不知道如何解析在iOS端的字符串。这里是JSON响应:'{“Start”:“\/Date(1302048496487)\ /”,“End”:“\/Date(1302055696487)\ /”}'。什么才是正确的代码来解析呢? – Gup3rSuR4c 2011-04-06 00:10:02

+0

划伤上述评论,我可以进一步格式化UTC时间... – Gup3rSuR4c 2011-04-06 01:08:11

+0

不幸的是,无视时区,虽然对计算机来说不错,但对于人类来说并不“完全正确”。夏令时等,这使得这更多的是一件苦差事:( – 2011-12-30 06:31:19

6

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