我想將時間字符串從一個時區轉換爲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]);
香港專業教育學院之前曾與這類似的問題。這是因爲英國的夏季時間。解決它的方法是使用'NSLocal',它似乎解決了我過去的問題,不知道爲什麼 – geminiCoder 2012-07-17 16:54:09
我試圖用en_US和en_GB設置兩個日期格式化器的區域設置,但沒有運氣遠! – mm282 2012-07-17 17:21:57
請注意,如果您將手機上的12/24設置設置爲「錯誤」,則會增加一些混淆(儘管它不能解釋1小時的差異)。 (但是如果你設定NSDate從一個無日期的日期,日期是1月1日,它不會是夏令時。) – 2012-07-17 18:43:15