具有默认时区的NSDateFormatter提供的日期与NSDate描述方法不同

时间:2013-05-23 15:20:09

标签: iphone date formatting nsdate nsdateformatter

NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp];
NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc] init];
[_dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];
[_dateFormatter setDateFormat:@"dd-MM-yy HH:mm"];
NSString *dateString = [_dateFormatter stringFromDate:date];
NSLog(@"Date: %@ formatted: %@", date, dateString);
[_dateFormatter release];

给我错误的日期格式:

日期:2013-01-31 18:00:00 +0000格式:31-01-13 19:00(来自时间戳:1359655200.000000)

在线转化工具:http://www.onlineconversion.com/unix_time.htm表示第一个日期正确无误:2013-01-31 18:00:00 +0000。

为什么NSDateFormatter会生成与NSLog不同的日期?打印到控制台时,[NSDate description]不应该使用defaultTimeZone吗?我和[_dateFormatter setTimeZone:[NSTimeZone localTimeZone]]得到同样的错误;和[_dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

2 个答案:

答案 0 :(得分:19)

这是正确的行为,因为:

  1. [NSDate description]使用UTC,而不是本地时区(这就是说明中有+0000的原因)。
  2. 您的NSDateFormatter正在使用当地时区。
  3. 您在丹麦,当地时区为中欧时间,目前UTC为1小时。
  4. 这些匹配的唯一方法是告诉NSDateFormatter使用UTC。但这可能不是你想要的。

答案 1 :(得分:-1)

这是您发现的时区问题。默认时区采用系统时区。比如,如果你在GMT + 1,你应该得到19-00。您使用的转换器为您提供GMT时间。

如果您需要特定时间区域,并且您知道GMT的偏移量,则可以使用以下内容

    [_dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:2*60*60]];//GMT+2.0

希望这能解决问题。