2010-12-11 45 views
12

我在NSDateFormatter在一個用戶的設備上失敗(在解析一個字符串時返回nil)並且在本地運行時(在模擬器中或在我的設備)。在兩個不同的設備上與NSDateFormatter不一致的行爲

我想排除什麼可能會導致此行爲的差異。我的第一個想法是語言環境,但我試着明確地設置它,以確保始終使用相同的區域設置,但它沒有區別。

下面是代碼:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

NSDate *theDate = [dateFormatter dateFromString:dateString]; 
NSLog(@"PARSING DATE %@ AS %@", dateString, theDate); 

在發生故障的設備,我得到:

PARSING DATE 2010-11-28T20:30:49-0000 AS (null) 

但本地獲得:

PARSING DATE 2010-11-28T20:30:49-0000 AS 2010-11-28 20:30:49 +0000 

這是推動我瘋了,我我缺少別的東西?

我運行4.2本地(模擬器)和我的設備(iPhone 4)。失敗的設備是運行4.2.1的3GS。

任何想法將不勝感激!

+0

由於您明確設置了格式字符串,您是否嘗試刪除區域設置代碼? – Costique 2010-12-11 19:24:33

+0

設備是否打開了「24小時制」設置?有關更多信息,請參閱[Apple QA1480](http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html)。 – Anna 2010-12-11 23:05:13

+0

是的,我已經嘗試過,沒有像上面那樣設置區域設置。 – 2010-12-12 00:17:59

回答

18

我很高興地說,我最終得到了這個問題的底部,我必須通過我的感謝@bendodson在Twitter上幫助我與此。 aBitObvious在他上面的評論中也遇到了這個問題;如果可以的話,我已經投了票。

用戶設備和我的設備之間有一個區別,那就是他的設備設置爲使用12小時制,而我的設備不是。這一件事意味着NSDateFormatter無法解析上述示例中的時間並返回nil。

到目前爲止,我對這個問題最大的問題是無法在本地重現問題!

所以,要清楚,要解決這個問題;也就是說,如果您正在解析日期/時間字符串,這些日期/時間字符串是已知的固定格式(通常來自某些API,因爲這是我的情況),您應該爲日期格式化程序設置正確的語言環境,這通常是en_US_POSIX。

... 
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
[dateFormatter setLocale:locale]; 
[locale release]; 

欲瞭解更多信息,請閱讀Apple QA1480

+1

謝謝 - 修復了一整天都在困擾我的bug! – 2011-11-14 15:59:31

+0

盧克,你是我的英雄! – 2013-08-15 11:51:28

+0

Gazillion upvotes。謝謝(不幸的是,我只能給1) – 2013-12-27 15:26:07

相關問題