2012-07-17 50 views
0

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

香港专业教育学院之前曾与这类似的问题。这是因为英国的夏季时间。解决它的方法是使用'NSLocal',它似乎解决了我过去的问题,不知道为什么 – geminiCoder 2012-07-17 16:54:09

+0

我试图用en_US和en_GB设置两个日期格式化器的区域设置,但没有运气远! – mm282 2012-07-17 17:21:57

+0

请注意,如果您将手机上的12/24设置设置为“错误”,则会增加一些混淆(尽管它不能解释1小时的差异)。 (但是如果你设定NSDate从一个无日期的日期,日期是1月1日,它不会是夏令时。) – 2012-07-17 18:43:15

回答

0

NSDate对象以绝对时间存储日期。例如,清单16中创建的日期对象表示4:00 PM CDT,5:00 EDT等等。

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

OP(意外地)似乎明白这一点。日期格式不符合预期。 – 2012-07-17 16:58:04

+0

正确@HotLicks,我假设我缺少与日期格式化程序有关如何计算转换差异的内容。 – mm282 2012-07-17 17:25:01

+1

@ mm282 - 您是否错过了1月1日不是夏令时的事实? – 2012-07-17 21:47:24