我想将时间字符串从一个时区转换为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