NSDateFormatter根据iOS版本返回不同的结果

时间:2012-10-24 18:31:25

标签: ios ios5 date ios6 nsdateformatter

我遇到与日期格式化程序相关的问题,它为日期“2012-10-21”返回null。

我只使用我想要测试的代码创建了一个示例项目,只是为了确保其他内容不会干扰结果。

在iOS 5中,它按预期执行,但在iOS 6中,日期格式化程序返回null。

这是我的代码:

NSString *myStringDate = @"2012-10-21";

//------------------------//

NSLog(@"Test 1");

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *myDate = [formatter dateFromString:myStringDate];
NSLog(@"Date: %@", myDate);

//------------------------//

NSLog(@"Test 2");

NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
[formatter2 setDateFormat:@"yyyy-MM-dd"];
[formatter2 setTimeZone:[NSTimeZone systemTimeZone]];
NSDate *myDate2 = [formatter2 dateFromString:myStringDate];
NSLog(@"TimeZone: %@", [NSTimeZone systemTimeZone]);
NSLog(@"Date: %@", myDate2);

//------------------------//

NSLog(@"Test 3");

NSDateFormatter *formatter3 = [[NSDateFormatter alloc] init];
[formatter3 setDateFormat:@"yyyy-MM-dd"];
[formatter3 setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:-7200]];
NSDate *myDate3 = [formatter3 dateFromString:myStringDate];
NSLog(@"TimeZone: %@", [NSTimeZone timeZoneForSecondsFromGMT:-7200]);
NSLog(@"Date: %@", myDate3);

//------------------------//

iOS 5.1模拟器结果:

Test 1
Date: 2012-10-21 03:00:00 +0000

Test 2
TimeZone: America/Sao_Paulo (BRST) offset -7200 (Daylight)
Date: 2012-10-21 03:00:00 +0000

Test 3
TimeZone: GMT-0200 (GMT-02:00) offset -7200
Date: 2012-10-21 02:00:00 +0000

iOS 6.0模拟器结果:

Test 1
Date: (null)

Test 2
TimeZone: America/Sao_Paulo (GMT-03:00) offset -7200 (Daylight)
Date: (null)

Test 3
TimeZone: GMT-0200 (GMT-02:00) offset -7200
Date: 2012-10-21 02:00:00 +0000

当日期为"2012-10-21"时,NSDateFormatter在iOS 6 中返回null。对于2012年的所有其他日期,结果在两个iOS版本上都是正确的。

任何人都可以解释原因吗?这是一个错误吗?我的代码错了?

2 个答案:

答案 0 :(得分:1)

看起来,保罗在10月20日/ 21日的一个小时内进行了夏令时变化(http://www.timeanddate.com/worldclock/clockchange.html?n=233)。这似乎不是巧合。测试1和2的计算时间可能在10月21日上午12点至凌晨1点之间,这是不可能的。在这方面,iOS 6可能会更加严格。

据我所知,你的代码看起来很好,它可能是iOS中的一个错误(或者它可能是预期的行为,iOS 5是问题,我无法分辨!)。其他日期似乎有效的事实表明操作系统问题,文档没有解释是否应该发生这种情况。

答案 1 :(得分:0)

这是我用来减少日期的代码:

  • (IBAction为)showPrevDate:(ID)发送方 { NSString * dateForDecrement = _showDateLbl.text;

    [dateFormatter setDateFormat:@“MMM d,yyyy(EEE)”]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    NSDate * dateObjectForDecrement = [dateFormatter dateFromString:dateForDecrement];

    int subtractDays = 1;

    NSDate * dateAfterDecrement = [dateObjectForDecrement dateByAddingTimeInterval :-(24 * 60 * 60 * subtractDays)]; [dateFormatter setDateFormat:@“MMM d,yyyy(EEE)”];

    _showDateLbl.text = [NSString stringWithFormat:@“%@”,[dateFormatter stringFromDate:dateAfterDecrement]];

}

不适用于iOS6,但适用于iOS5。你能核实一下吗?