2012-07-17 86 views
0

我想將時間字符串從一個時區轉換爲NSDate對象,然後使用本地時區將其輸出回字符串。不過,我似乎要去1個小時了。舉個例子,我在輸出時區中添加了一個可以顯示錯誤的例子。有幾個類似的問題,但沒有提供一個提示,我哪裏出錯了這個!發佈時這兩個時區目前都處於夏令時狀態 - 但NSDateFormatter應根據時區考慮任何差異。將字符串轉換爲NSDate,時區不正確調整?

更新:這個問題似乎與將洛杉磯時間轉換爲格林威治標準時間,而不是向BST轉換。就我所知,所有NSDate都以GMT格式存儲。下面的代碼演示了這種(添加語言環境 - 似乎並沒有發揮作用):

NSDateFormatter *dateF = [[NSDateFormatter alloc] init]; 
[dateF setDateFormat:@"HH:mm"]; 
[dateF setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]]; 
[dateF setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; 
NSDate* sourceDate = [dateF dateFromString:@"09:15"]; 

NSLog(@"Date GMT: %@", [sourceDate description]); 
NSLog(@"Date BST: %@", [sourceDate descriptionWithLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]]); 

輸出:

日格林尼治標準時間:1970-01-01 17時15分00秒+0000 這是錯誤!

日期BST:週四,1970年1月1日18時15分00秒GMT + 01:00 因此,這是不正確太

原來的例子

在洛杉磯09:15應該是17 :15在倫敦,而不是18:15 ...

NSDateFormatter *dateF = [[NSDateFormatter alloc] init]; 
[dateF setDateFormat:@"HH:mm"]; 
[dateF setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]]; 

NSDate* sourceDate = [dateF dateFromString:@"09:15"]; 

NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; 
[dateformatter setDateFormat:@"HH:mm"]; 
[dateformatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]]; 
NSLog(@"%@", [dateformatter stringFromDate:sourceDate]); 
+0

香港專業教育學院之前曾與這類似的問題。這是因爲英國的夏季時間。解決它的方法是使用'NSLocal',它似乎解決了我過去的問題,不知道爲什麼 – geminiCoder 2012-07-17 16:54:09

+0

我試圖用en_US和en_GB設置兩個日期格式化器的區域設置,但沒有運氣遠! – mm282 2012-07-17 17:21:57

+0

請注意,如果您將手機上的12/24設置設置爲「錯誤」,則會增加一些混淆(儘管它不能解釋1小時的差異)。 (但是如果你設定NSDate從一個無日期的日期,日期是1月1日,它不會是夏令時。) – 2012-07-17 18:43:15

回答

0

NSDate對象以絕對時間存儲日期。例如,清單16中創建的日期對象表示4:00 PM CDT,5:00 EDT等等。

NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CDT"]]; 
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init]; 
[timeZoneComps setHour:16]; 
//specify whatever day, month, and year is appropriate 
NSDate `enter code here`*date=[gregorian dateFromComponents:timeZoneComps]; 
+0

OP(意外地)似乎明白這一點。日期格式不符合預期。 – 2012-07-17 16:58:04

+0

正確@HotLicks,我假設我缺少與日期格式化程序有關如何計算轉換差異的內容。 – mm282 2012-07-17 17:25:01

+1

@ mm282 - 您是否錯過了1月1日不是夏令時的事實? – 2012-07-17 21:47:24