2013-02-08 29 views
2

我們的iOS的iPhone應用程序,包含此代碼,在iOS 5中產生如下命名resultDate一個有效的NSDate對象:iOS 6.1 NSDateFormatter自iOS 5以來發生了變化 - 破解解析?

static NSDateFormatter *invariantFmt = nil; 
    if (!invariantFmt) { 
     invariantFmt = [[NSDateFormatter alloc] init]; 
     NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
     [invariantFmt setLocale:locale]; 
     [locale release]; 
     [invariantFmt setDateStyle:NSDateFormatterShortStyle]; 
     [invariantFmt setTimeStyle:NSDateFormatterMediumStyle]; 
    } 
    NSDate *resultDate = [invariantFmt dateFromString:@"08/04/2010 10:43:39 AM"]; 

升級到了XCode 4.6和iOS 6.1後,該代碼現在給出resultDate一個零,所以他們用來解析的東西已經改變了。發行說明中沒有提到有關NSDateFormatter更改的信息。互聯網研究只是發現他們可能已經改爲使用更新的Unicode UTS語言環境解析標準。顯然他們改變了東西。在用代碼編寫代碼並獲取已知的有效NSDate對象並應用相同的NSDateFormatter設置來獲取NSString後,我發現iOS 6.1喜歡使用此字符串:@「08/04/2010,10:43:39 AM」

唯一的區別是在日期部分之後多餘的逗號。在iOS 6.1中使用該代碼可以使用相同的上述代碼返回有效的日期。任何人看到這一點,並理解爲什麼這是不同的,或者如果這是一個好的Unicode更改或Apple錯誤?

+0

你應該向Apple提交一份錯誤報告。 – trojanfoe 2013-02-08 14:20:13

+0

或者我應該停止使用日期「樣式」(短,中,長)並使用精確的格式,比如調用setDateFormat來代替?這樣做似乎在這兩種iOS版本中都有效。 – stonedauwg 2013-02-08 14:27:50

+0

雖然這不會讓i18n變得困難嗎? – trojanfoe 2013-02-08 14:28:54

回答

1

格式樣式應該只用於將NSDate對象轉換爲文本以顯示給用戶。在以已知格式分析日期字符串時,您必須使用特定的格式,而不是樣式。使用en_US_POSIX語言環境用於確保您指定的格式不受操作系統根據用戶首選項(例如24小時時間設置)的調整。

因此,如您所懷疑的那樣,您需要刪除兩個調用來設置日期和時間樣式,並用一個調用替換它們以設置與您需要解析的已知日期/時間字符串相匹配的特定格式。

+0

沒有解釋爲什麼這個行爲從iOS版本改變,但我同意你的邏輯 – stonedauwg 2013-02-08 15:58:46

+0

最有可能的是,逗號是一種新的行爲一個日期和一個時間,這個東西隨着時間的推移而變化或者固定下來,這就強制了你在處理固定格式的日期字符串時必須使用固定格式而不是樣式。 – rmaddy 2013-02-08 16:05:35

+0

同意,+1給你 – stonedauwg 2013-02-08 16:13:46

0

通常情況下,您不應該將格式化的日期輸出到文件,並且稍後要將其解析回來。
日期應該存儲爲長時間值UTC(帶或不帶附加的時區偏移量)。 只有在最後一刻,在將UI日期可視化之前,它應該被格式化並應用本地時間。

這不僅是我smy的經驗,它也是在Apple DateFormatting Doku中陳述的。

+0

我們不會將其輸出到文件。它是通過已經格式化的服務發送給我們的。我一般同意UTC最好傳遞,但在這種情況下,我們處於傳統服務的擺佈之中。 – stonedauwg 2013-02-08 16:02:12