2013-11-01 29 views
1

當runDate的值是@「Fri,2013年11月1日08:47:33 GMT-0500」時,我在iOS 7 iPhone模擬器上得到零,但在iOS 6 iPhone模擬器上沒問題爲什麼NSDateFormatter在iOS 7上返回零號

 NSString *runDate = [reportDictionary objectForKey:@"runDate"]; 

     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 
     formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss ZZZ"; 

     NSDate *actualRunDate = [formatter dateFromString:runDate]; 

我結束了零的在iOS模擬器7的actualRunDate但不能在iOS 6.1

我怎樣才能得到它在iOS 7的工作?

+1

時區格式應該是'ZZZZ'(4個Zs,而不是3個)。 – rmaddy

+0

@rmaddy可能是解決方案。但請注意,時區可以是3個或4個字母,具體取決於它提供的方式:「時區 - 具有特定的非位置格式。如果不可用,則返回到本地化的GMT格式。短格式或全格式的四格。在短格式中,除非常用的標誌在區域設置中打開,否則不會使用元區名稱。「 –

+1

使用這種格式,我仍然沒有。 @「EEE,dd MMM yyyy HH:mm:ss ZZZZ」 – finneycanhelp

回答

3

啊,我想我明白髮生了什麼。

根據該文檔,你可以在格式的日期指定三個「ZZZ」字符:

Fri, 01 Nov 2013 08:47:33 -0500 

而且你可以在格式指定日期四個「ZZZZ」字符:

Fri, 01 Nov 2013 08:47:33 GMT-05:00 

請注意GMT小時和分鐘之間的冒號字符!

因此,我認爲解決的辦法(如果你不能改變你得到的日期格式),是設置格式如下:

formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss 'GMT'ZZZ"; 

。 。這將跳過'GMT'部分,將其視爲'ZZZ'格式的日期。

正如@rmaddy在評論中指出的那樣,該解決方案假定所有日期在時區中都有字母'GMT'。如果它們是相對於其他時區表示的,那麼您必須修正提供日期的格式,或者可能首先手動解析字符串(使用正則表達式或其他東西提取這些字符),if你根本無法做到這一點。

理想的解決方案是修復提供給客戶端的日期格式,但根據合同優先開發的原則,我們應該儘可能寬容(假設您需要解析的日期正在從許多下游用戶的遠程服務中消耗,如果格式得到糾正,所有這些都可能不得不改變)。

+1

最後的解決方案只在所有日期字符串引用'GMT'的情況下才有效。 – rmaddy

+1

好點@rmaddy - 更新了答案。 –

1

如果你從你試圖解析字符串中刪除GMT,讓它看起來像這樣

@"Fri, 01 Nov 2013 08:47:33 -0500" 

返回將是正確的日期。其他一切似乎都很好。