2011-04-05 97 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]