【问题标题】:NSDateFormatter return different results depending on iOS versionNSDateFormatter 根据 iOS 版本返回不同的结果
【发布时间】:2012-10-24 18:31:24
【问题描述】:

我有一个与日期格式化程序有关的问题,它为日期“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

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

谁能解释为什么?它是一个错误?我的代码错了?

【问题讨论】:

    标签: ios ios5 date ios6 nsdateformatter


    【解决方案1】:

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

    据我所知,您的代码看起来不错,这可能是 iOS 中的一个错误(或者它可能是预期的行为,而 iOS 5 是问题所在,我不知道!)。其他日期似乎有效的事实表明存在操作系统问题,文档没有解释这是否应该发生。

    【讨论】:

    • 您好 WDUK。你说的很有道理。我测试了 2011 年、2013 年和 2014 年,并且每天都会在夏令时从我的时区开始时发生错误。现在我必须检查在这种情况下要做什么,以防止日期格式化程序返回 nil。感谢您的帮助。
    • 这听起来像是不应该发生的事情,向 Apple 提交一份关于它的错误报告(特别是如果 iOS5 没有返回 nil)。 bugreporter.apple.com
    • 好的,我会这样做的。感谢您的宝贵时间!
    【解决方案2】:

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

    • (IBAction)showPrevDate:(id)sender { NSString *dateForDecrement = _showDateLbl.text;

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

      NSDate *dateObjectForDecrement = [dateFormatter dateFromString:dateForDecrement];

      int 减天数 = 1;

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

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

    }

    不适用于 iOS6,但适用于 iOS5。可以验证吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多