2013-05-31 72 views
-1

我有以下代碼NSDateFormatter一個小時總是

NSString *dateString = @"2013-05-24T10:30:00+0200"; 
     NSLog(@"date string before format %@", dateString); 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
     NSDate *date = [dateFormatter dateFromString:dateString]; 
     dateString = [dateFormatter stringFromDate:date]; 
     NSLog(@"date string after format %@", dateString); 

降低日期和輸出是:

date string before format 2013-05-24T10:30:00+0200 
date string after format 2013-05-24T09:30:00+0100 

爲什麼它顯示10:30然後9:30!?

+1

你是什麼時區? – dthien

+0

2013-05-24T10:30:00 + 0200與2013-05-24T09:30:00 + 0100相同,只是時區不同。 +0200和+0100是時區 – fredrik

回答

2

時區會造成麻煩

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT+0:00"]]; 

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
+0

我試過並且更糟::( 現在它減少2小時: 格式化之前的日期字符串2013-05-24T10:30:00 + 0200 格式化後的日期字符串2013-05 -24T08:30:00 + 0100 –

2

結果是OK。這兩個日期都是相同的,只是在分析字符串到NSDate,NSLog打印輸出與您的本地區域。

請參閱:您有10:30 + 2h字符串和9:30 + 1h解析日期中的時區偏移量。這意味着這兩個日期是澄清8:30 GMT

編輯:

NSDate是日期表示獨立的時區。因此,解析的NSDate實例的內部表示可以正確地在輸入字符串中描述日期,並且可以安全地使用日期進行計算等。它僅取決於NSDateFormatter如何創建最終字符串。它默認在您的本地時區創建字符串。這就是爲什麼你的輸出與輸入不完全相同的字符串。但是,如果您計算小時數+時區偏移量,則這是正確的。

如果你真的需要有相同的輸出字符串,你必須明確的NSDateFormatter的時區或NSLocale設置爲相同的時區作爲輸入日期字符串有(用時區的一些區域設置/時區偏移+2從GMT

+0

我在這裏打印一個字符串whith NSLog()沒有日期 –

+0

這並不重要,你打印的字符串是你使用'NSDateFormatter'構造的,但是日期格式化程序會給你輸出因此,除非你明確地設置一些'NSLocale'到輸出日期格式化程序,否則你會在當地時區得到結果 –

+0

嗯你說得對, 我不得不從字符串date(「 +0200「)通過使用[NSString substringToIndex:19],然後使用此日期格式化程序」yyyy-MM-dd'T'HH:mm:ss「 Th幫助 –

0

的時間是一樣的,它只是一個不同的時區,只需設置你的時區時間:

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];