2010-08-23 40 views
0

我有一個日期,2010-08-23 13:30:00 -0400,我試圖在UTC +2時區中獲取它。秒的差異是21600,但是當我撥打[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];時,我得到2010-08-24 01:30:00 +0200,應該是2010-08-23 19:30:00 +0200。任何想法我做錯了什麼?使用initWithTimeInterval獲取錯誤日期:sinceDate:

回答

2

日期對象代表特定的時刻,不管當時可能有哪些不同的人的時鐘。

當你想顯示日期時,你會通常顯示用戶的時鐘會說的(或正在說或將要說的)時區。這正是當你在一個NSDate中使用NSLog時發生的情況:日期的描述就是你當地時區所代表的時刻。

添加到NSDate或從NSDate中減去不是時區轉換。加減法產生代表其他時刻的NSDates;在你的情況下,你創建一個NSDate的時刻,從你開始的那一刻起6個小時,而不是在地球另一側的同一時刻。

爲了簡化,時區轉化是在空間看着同時不同點(地球表面的不同部分),而日期加減是計算不同時間

對於NSDate,沒有時區轉換,因爲它不在開始的時區。只有格式化該時區的日期時纔會涉及時區。因此,要在其他時區顯示該日期,請執行此操作。通常,這意味着將您想要的時區提供給您的date formatter

+0

嗯,你完全正確。我正在改變時間,而不是空間的角度。 – Collin 2010-08-23 19:50:13

1

我看到你回來的日期有不同的時區+200而不是-400。如果您注意到,您會看到該結果恰好比原始日期晚12小時(或6小時+ 6小時)。當你做出新的約會時,你是否偶然改變了語言環境?當您進行的變更開始給您+200而不是-400時,系統會自動調整補償時間,然後您再添加6小時到日期。 NSDate將自2001年1月1日以來的所有日期存儲爲一個時間間隔,並根據需要調整時區。

+0

不,我沒有改變它。但我認爲彼得霍西解釋了什麼是錯的。不管怎麼說,還是要謝謝你。 – Collin 2010-08-23 19:51:04

+0

真的嗎?那麼爲什麼會有不同的時區偏移量,以及您沒有添加的額外6小時來自哪裏? – theMikeSwan 2010-08-23 19:54:03

+0

theMikeSwan:我的猜測是他解析了包含-0400時區偏移量的日期字符串,然後進行了添加,然後使用NSLog記錄了結果,NSLog使用了他的本地時區(恰好是所需的目標時區) 。時區轉換加上他添加的6小時,佔了12個小時。 – 2010-08-23 20:10:43