2014-09-04 103 views
0

所以,我有一個格式爲YYMMDDHHMMSS的字符串,我試圖(很難)從它得到一個合適的NSDate對象。iOS的NSDate和NSDateFormatter行爲

這是我的代碼:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 
[format setDateFormat:@"yyMMddHHmmss"]; 
NSDate *date = [format dateFromString:@"140904123421"]; 

的NSLog(@ 「DATE:%@」,日期);

而且我越來越怪異幾次都是這樣:

DATE: 2014-09-04 17:04:21 +0000 

我檢查這個table和我格式化似乎是正確的,我也試圖消除語言環境,但我仍然有錯誤的日期。那麼,是否有可能恢復正確的時間?

謝謝。

+3

當您記錄一個NSDate對象時,您始終以格式顯示它,時間顯示爲GMT。 – rdelmar 2014-09-04 17:21:29

+0

你是對的。我將它轉換回NSString並獲得原始字符串。問題是,我需要將其保存到數據庫(SQLite)並且查詢正在錯誤的時間進行。有什麼建議麼? – ilbesculpi 2014-09-04 17:29:26

+0

只是爲了澄清,我期待我的數據庫與這個時間一起工作:2014-09-04 12:34:21,而不是2014-09-04 17:04:21 – ilbesculpi 2014-09-04 17:30:14

回答

2

正如您對問題的評論中指出的那樣,您的NSDate是正確的; NSDate始終將其時間存儲在GMT中。默認情況下,當NSDateFormatter解析日期時,它會將其從當地時區轉換爲GMT,以便存儲在生成的NSDate對象中的內容保持一致(實際上它比這更細緻,但您可以這樣想)。由於您的時區爲GMT-04:30,這意味着它會爲您的時間增加4小時30分鐘,因此2014-09-04 12:34:21 GMT-4:30 = 2014-09-04 17:04:21 GMT(正如@MartinR指出的那樣)。

從您的意見,這聽起來像你需要在您的數據庫中存儲此日期的格式yyyy-MM-dd HH:mm:ss,在當地時間。要做到這一點,最簡單的方法是簡單地使用第二NSDateFormatter

NSDateFormatter *formatOut = [[NSDateFormatter alloc] init]; 
[formatOut setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSString *dateString = [formatOut stringFromDate: date]; 

由於NSDateFormatter將默認使用當地時區,應該從GMT「轉換」 dateGMT-4:30並設置dateString2014-09-04 12:32:21


之所以這麼說,存儲在您的本地時區的日期是幾乎總是一個壞主意。時區是棘手的事情,所以最好始終在GMT/UTC的日期存儲和做任何計算,然後只在將它顯示給用戶時將其轉換爲本地時間。如果你的時區以外的人訪問你的數據,你的時區規則改變(比你想象的更頻繁發生),你需要將你的日期傳遞給一些外部服務/應用程序等,這將爲你節省很多痛苦。

+0

切勿在當地時間儲存時間。從開始看似乎是一個好主意,但會適得其反。或者,至少要確保存儲的日期包含時區標識符。 – 2014-09-04 19:27:14

+0

@HotLicks非常真實。我添加了一個註釋來解釋這個問題。 – 2014-09-04 19:41:09