为什么我的NSDate时区不正确?

时间:2014-02-28 18:27:16

标签: ios timezone nsdate nsdateformatter

以下是代码:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];

NSDate* newTime = [dateFormatter dateFromString:@"2011-10-19T12:22:07Z"];

[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormatter setDateFormat:@"dd-MMM-yyyy HHmm"];

NSString* finalTime = [dateFormatter stringFromDate:newTime];

问题:

我在多伦多(EST,GMT-5)。我的最后时间应该显示0722,我看到0822.检查对象我可以看到newTime是'2011-10-19 08:22:07 EDT'。我不确定为什么会发生这种情况但是它仍然存在于finalTime字符串中,尽管将dateFormatter时区设置为systemTimeZone。我假设systemTimeZone是EDT呢?任何了解为什么会发生这种情况或如何纠正它的人都会非常感激。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您目前在多伦多EST。你回来的这个时间报告正在显示EDT。这是东部夏令时。确保你减去一个小时的夏令时,因为它是EDT而不是EST。


我现在出去所以我无法测试此代码,但我认为这应该有效:

NSDate *currentDate = [NSDate date];
NSTimeZone *currentZone = [NSTimeZone localTimeZone]; 

if ([currentZone isDaylightSavingTimeForDate:currentDate]) {
   //adjust the time by 1 hour here
}

答案 1 :(得分:1)

一些事情:

  1. 不要在日期格式化程序上设置时区。然后删除格式字符串中Z周围的引号。这将允许日期格式化程序从实际日期字符串中确定时区。
  2. 0822的输出对于您的系统时区是正确的,因为您在10月19日的白天节省了时间。那天你是GMT-4,而不是GMT-5。在加拿大,2011年,夏令时于11月6日结束。