2011-09-06 15 views
5

此代碼NSCalendar dateFromComponents:GMT時區,而不是systemTimeZone

NSCalendar *calendar =[NSCalendar currentCalendar]; 
[gregorian setTimeZone:tz]; 

NSLog(@"%@", [gregorian timeZone]); 

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:[NSDate date]]; 

[comp setDay:info.day]; 
[comp setMonth:info.month]; 
[comp setYear:info.year]; 
[comp setHour:info.hour]; 
[comp setMinute:info.minute]; 
[comp setSecond:info.second]; 
[comp setTimeZone:tz]; 

NSLog(@"%@", [comp timeZone]); 
NSLog(@"%@", [gregorian dateFromComponents:comp]); 

顯示在控制檯中的以下內容:

Europe/Moscow (MSKS) offset 14400 (Daylight) 

Europe/Moscow (MSKS) offset 14400 (Daylight) 

2011-08-31 20:00:00 +0000 

因此,日曆和組件的時區是正確指定,但[gregorian dateFromComponents:comp]返回NSDate的價值錯誤的時區(GMT)。

我需要更正什麼才能獲得正確的時區?

+2

如果您是直接的NSLog一個'NSDate'object,你總是會得到它的GMT表示。無論如何,'NSDate'對象沒有任何時區的概念。它們代表從參考日期開始測量的**絕對**時間。您可以使用'NSDateFormatter'爲不同的時區獲得日期不同的可讀*表示*,但它們是表示。 – albertamg

+0

我認爲NSDate在時間戳的不重要的位隱藏了它的派生時區。但這只是用於[NSDate描述],並且最好是不可靠的。 –

+0

是的,你說得對,夥計們。 謝謝,現在我明白了:) – Mitry

回答

6

你看到的輸出是完全正常的。如果您直接NSLog NSDate對象,您將得到任何description方法返回,這是日期的格林威治時間表示(但不是石刻)。

NSDate對象不受時區的限制。 A NSDate代表從參考日期開始測量的瞬時時間的絕對。例如,在撰寫本文時,當前日期與337035053.199801(自參考日期以來的秒數)類似,可以表示爲2011-09-06 20:50:53 GMT2011-09-06 22:50:53 CEST。兩者都是日期相同的日期的不同人類可讀的表示。

總之,您需要什麼來獲得正確的時區?您需要使用NSDateFormatter在您喜歡的任何時區中獲取NSDate的字符串表示形式。

+0

NSDate被引用到GMT。 – zaph

+1

參考日期實際上是格林威治標準時間2001年1月1日的第一次。無論如何,這代表了我們開始計算的時間點,即'0.0',並且您可以使用任何時區表示該時間點。 – albertamg

+0

還有一個空間的地方,特別是一個時區。 – zaph

1

這個問題經常出現,答案是使用NSDateFormatter來獲得日期格式所需的輸出。目前它始終打印GMT時區。下面是文檔的討論爲NSDate

討論
的表示不能保證留跨操作系統的不同版本 不變。要格式化 日期,你應該使用的日期格式對象,而不是(見 NSDateFormatter和數據格式指南)

相關問題