我正在尝试将时间字符串从一个时区转换为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]);
答案 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。