NSDate使用NSDateFormatter无法正确转换

时间:2011-06-11 21:18:07

标签: ios nsdate nsdateformatter

我有以下NSDateFormatter:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM. d, yyyy"];

NSLocale *usLocal = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:usLocal];

我有一个while循环,它从给定的开始日期开始,并将日期递增1,直到达到特定的结束日期。

NSDate *d = start;
while(YES){     
   NSString *td = [dateFormatter stringFromDate:d];
   NSLog(@"converted date %@ to %@",d,td);
   ...adds a date and re-initializes d
}

我得到的输出如下:

2011-06-11 17:10:18.678 ListOf100[8784:707] converted date 2011-05-31 00:00:00 +0000 to May. 30, 2011
2011-06-11 17:10:18.687 ListOf100[8784:707] converted date 2011-06-01 00:00:00 +0000 to May. 31, 2011
2011-06-11 17:10:18.717 ListOf100[8784:707] converted date 2011-06-02 00:00:00 +0000 to Jun. 1, 2011

如您所见,所有日期都没有正确转换。他们全都休息了一天。为什么会发生这种情况?我该如何解决?

2 个答案:

答案 0 :(得分:3)

在我看来,日期是在与格式化工作者不同的时区创建的。

NSDate * d = [NSDate dateWithTimeIntervalSince1970:800000];    
// Arbitrary date

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM. d, yyyy"];

NSLocale *usLocal = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:usLocal];


//!!!: Set time zone
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSString *td = [dateFormatter stringFromDate:d];
NSLog(@"converted date %@ to %@",d,td);

收率:

  

2011-06-11 22:44:01.642 TimeZoneFormatter [21901:207]转换日期1970-01-10 06:13:20 +0000至1970年1月10日

答案 1 :(得分:1)

不知道为什么会发生这种情况,但是如果它持续存在,修复它应该比在转换它之前添加一天更难:

NSString *td = [dateFormatter stringFromDate:[d dateByAddingTimeInterval:86400]];