时区转换结果错误

时间:2010-10-06 06:52:23

标签: iphone timezone

CCT为UTC + 6:30,SGT为UTC + 8:00。但结果是错误的

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM dd, yyyy h:mm"];


// The date in your source timezone (eg. EST)
NSDate* sourceDate = [NSDate date];


 NSLog([formatter stringFromDate:sourceDate]);

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"SGT"];
//NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSTimeZone* destinationTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"CCT"];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];


NSLog([formatter stringFromDate:destinationDate]);

结果看起来像那样

  

2010-10-06 14:45:41.143   TimeZone [4805:207] 2010年10月6日

     

2010-10-06 14:45:41.144 2:45   TimeZone [4805:207] 2010年10月6日   6:45

我改为

NSTimeZone* destinationTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Rangoon"];

它工作正常。为什么不使用timeZoneWithAbbreviation

1 个答案:

答案 0 :(得分:0)

因为“CCT”无效缩写。您可以像这样检查:

NSTimeZone* destinationTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Rangoon"];
NSLog(@"%@", [destinationTimeZone name]);
NSLog(@"%@", [destinationTimeZone abbreviation]);

打印出来:

2010-10-06 09:10:59.846 MyTest[39159:207] Asia/Rangoon
2010-10-06 09:10:59.892 MyTest[39159:207] GMT+06:30

请参阅timeZoneWithAbbreviation:

文档中的讨论
  

通常,不鼓励使用缩写,但“UTC”或“GMT”等唯一实例除外。时区缩写不是标准化的,因此给定的缩写可能有多种含义 - 例如,“EST”指的是美国和澳大利亚的东部时间

顺便说一句,您可以使用[NSTimeZone abbreviationDictionary]

获得带有效缩写的NSDictionary