【问题标题】:dateFromString does not work correctly in iOS 6dateFromString 在 iOS 6 中无法正常工作
【发布时间】:2012-10-31 06:09:34
【问题描述】:

此代码在 iOS 5 中有效,但在 iOS 6 中返回错误年份。知道为什么吗?

NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSLocale *locale=[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setCalendar: gregorian];
    [dateFormatter setLocale: locale];
    [dateFormatter setDateFormat:@"yyyy"];

    NSDate* date=[dateFormatter dateFromString:[NSString stringWithFormat:@"9000"]];

    NSLog(@"Date: %@", [dateFormatter stringFromDate:date]);

    [gregorian release];
    [locale release];
    [dateFormatter release];

以上在 iOS 5 中生成日期 9000,在 iOS 6 中生成日期 2000!

谢谢。

【问题讨论】:

  • 登录date会看到什么?
  • 将 9000 更改为 2012 在 iOS 5 和 6 上始终给出相同的结果。stringFromDate 和原始 NSDate 在 iOS 5 和 6 中都是一致的,比如 2012 年。也许 9000 有点奇怪!
  • 它适用于 3512 但不适用于 3513,即我猜它可以继续使用 1500 年
  • 非远程日期在 iOS 5 和 6 上都能正常工作。远距离日期仅在 iOS 5 上有效。在 iOS 6 中,NSGregorianCalendar 似乎不适用于远距离日期。似乎需要 NSISO8601Calendar 代替。这是我可以安全更改的东西吗?
  • 我检查并发现在 3512 返回 19 世纪和 20 世纪的日期之后的所有年份的行为都是相同的。

标签: iphone nsstring ios6 nsdate


【解决方案1】:

我通过用 NSISO8601Calendar 替换 NSGregorianCalendar 解决了这个问题:

NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier: NSISO8601Calendar];

这行得通,但如果我知道原因,我会感觉更好。有人知道 NSGregorianCalendar 和 NSISO8601Calendar 的区别吗?

【讨论】:

    【解决方案2】:

    它看起来像苹果在 IOS 6 中添加了“自己的 Maya 日历” 我在文档中找不到关于它的任何信息,但我自己尝试了一下,它看起来像在 3512 年后自动设置情人年份,如 2013 年(是 3513 年)、2014 年(如果是 3514 年)等。

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    [dateFormatter setCalendar:gregorian];
    [dateFormatter setLocale:locale];
    [dateFormatter setDateFormat:@"yyyy"];
    
    NSDate* date = [dateFormatter dateFromString:@"3512"];
    
    NSLog(@"Date: %@", [dateFormatter stringFromDate:date]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 2013-01-01
      • 2012-09-10
      • 1970-01-01
      • 2018-10-29
      • 2019-03-11
      • 2021-06-14
      • 1970-01-01
      相关资源
      最近更新 更多