将字符串转换为NSDate,时区不能正确调整?

时间:2012-07-17 16:49:28

标签: iphone objective-c ios

我正在尝试将时间字符串从一个时区转换为NSDate对象,然后使用本地时区将其输出回字符串。但是我似乎要走了1个小时。举个例子,我在输出时区中添加了以便我可以显示错误。有几个类似的问题,但没有任何暗示我在这个问题的哪个地方!这两个时区目前都在白天节省时间 - 但NSDateFormatter应该根据时区处理任何差异。

更新:问题似乎是将洛杉矶时间转换为GMT,而不是转发给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"]]);

输出:

日期GMT: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]);

2 个答案:

答案 0 :(得分:0)

NSDate对象以绝对时间存储日期。例如,清单16中创建的日期对象表示CDT下午4:00,美国东部时间5:00,依此类推。

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];

答案 1 :(得分:0)

来自NSTimeZone docs:

  

请注意,严格来说,时区数据库条目(例如“America / Los_Angeles”)是ID而不是名称。时区名称的示例是“太平洋夏令时”。尽管许多NSTimeZone方法名称都包含“name”一词,但它们指的是ID。

https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSTimeZone_Class/Reference/Reference.html