2010-09-22 65 views
0

我有一個字符串,例如2010-09-24。現在,我希望這個字符串像我在其他時區一樣被讀取。所以我創建一個NSDateFormatter並設置它的時區,例如到Europe/Berlin。我回來的是NSDate對象(2010-09-23 18:00:00)調整到我的本地時區(例如America/New_York)。Cocoa中的日期和時區問題

但我想在時區Europe/Berlin與時間值2010-09-24 00:00:00。我怎樣才能做到這一點?

我試圖在[dateFormatter dateFromString:@"2010-09-24"]期間將defaultTimeZone設置爲Europe/Berlin,但是當我將時區更改回當地時區時,NSDate對象也發生了變化。

回答

1

的NSDate只是一個CFDate,它代表了CFAbsoluteTime,這僅僅是POSIX時間(UTC-秒紀元以來)有不同時代(2001年代替1970年)。 (我很肯定CFAbsoluteTimeGetCurrent()只是調用gettimeofday();它似乎只有微秒的分辨率。)

或者,簡而言之:NSDate是一個時間戳,而不是日曆日期。如果您想要代表日期/時間日曆,請使用NSDateComponents。無論哪種情況,您都需要指定日曆(可能是格里曆)和時區;請參閱NSCalendar。

的差異取決於大約在當您更改時區偏移會發生什麼:

  • 「在我家金星黨的交通」同時發生無處不在,所以使用通用時間(NSDate的)
  • 「吃午飯「發生在當地時間的當地時間,所以使用NSDateComponents。

如果您認爲事件的時區偏移不會更改,則指定NSDate和NSTimeZone名稱很方便。許多日曆應用都會這樣做,並且(幾乎)美國決定更改DST規則時,一切都會出錯。