2012-01-15 69 views
15

我必須從objective-c中的NSString初始化一個NSDate對象。我不喜歡這樣寫道:爲什麼我的時區不能保存到我的NSDate中?

NSString *dateString = [[webSentence child:@"DateTime"].text stringByReplacingOccurrencesOfString:@"T" withString:@" "]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-mm-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Budapest"]]; 

NSDate *date = [[NSDate alloc] init]; 
date = [dateFormatter dateFromString:dateString]; 

例如:當我和字符串值試試@「2011-01-02 17點49分54秒」我得到一個NSDate 2011-01-02 16點49分54秒+ 0000。正如你所看到的,兩個值之間有一個小時的差異。 NSDate有一個錯誤的值,它應該與我在dateFormatter中設置的時區中的字符串中定義的值完全相同。它似乎使用我的日期定義它的字符串作爲UTC,即使我將其時區設置爲「歐洲/布達佩斯」。我該如何解決這個問題?

謝謝!

回答

14

兩件事:

1)您的日期格式字符串中有錯誤。您應該使用MM爲一個月,不mm(小寫毫米爲分鐘)

2)創建你的NSDate對象之後,你就需要使用NSDateFormatter方法stringFromDate:產生定位於一個特定的時區的日期字符串。如果你只是做一個直的NSLog()上的NSDate對象,它會顯示默認的日期爲格林尼治標準時間(GMT背後是布達佩斯時間一小時)相對於標準基準日

+0

非常感謝! – Tom 2012-01-15 01:11:24

+0

那麼這意味着如果我有一個時區,我不能將日期存儲到具有該時區的NSDate對象中?我將不得不在顯示的時候在其他地方和用戶存儲時區? – Nil 2016-06-15 07:41:17

27

的NSDate日期存儲。來自課堂文檔:

「NSDate的唯一基本方法timeIntervalSinceReferenceDate爲NSDate接口中所有其他方法提供了基礎,該方法返回相對於絕對引用日期的時間值 - 第一個1格林威治標準時間2001年1月

的NSDate本身沒有時區的任何概念。所以NSDateFormatter做了正確的事情:它轉換了一個你告訴它有一個GMT偏移量的日期(通過指定一個時區),並給你一個「標準化」的NSDate。

如果要查看歐洲/布達佩斯時區中顯示的日期,請使用現有日期格式化程序(-stringFromDate :)或相應的NSDate描述方法(例如-descriptionWithCalendarFormat:timeZone:locale :)。

P.S.-書面你不需要的分配/在你的代碼在所有的初始化。在非ARC這將是一個泄漏。

P.P.S.-您的日期格式不正確,並給予荒謬的結果。我已經提前清理了您的代碼,如下所示(在ARC下測試):

NSString *dateString = @"2011-09-02 17:49:54"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"Europe/Budapest"]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[dateFormatter setTimeZone:tz]; 

NSDate *date = [dateFormatter dateFromString:dateString]; 
NSLog(@"%@", [dateFormatter stringFromDate:date]); 
NSLog(@"%@", [date descriptionWithCalendarFormat:nil timeZone:tz locale:nil]); 
+0

所以NSdate沒有時區的概念。但它有GMT概念?我不能將時區轉換爲GMT小時並將其添加到NSDate對象? – Nil 2016-06-15 07:43:21

相關問題