代码之家  ›  专栏  ›  技术社区  ›  AtomRiot

nsdateFormatter在OS 4.0中返回nil

  •  26
  • AtomRiot  · 技术社区  · 14 年前

    我在操作系统3.x上使用了以下代码

    NSString *stringDate = @"2010-06-21T20:06:36+00:00";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    NSDate *theDate = [dateFormatter dateFromString:stringDate];
    NSLog(@"%@",[dateFormatter stringFromDate:theDate]);
    

    但是现在在最新的xcode 3.2.3中,在ios4模拟器下,日期的变量为零。

    我已经查看了类引用,没有看到使用这些特定方法的IOS4有任何不推荐使用或实现不同的地方。我漏掉了什么?

    13 回复  |  直到 10 年前
        1
  •  41
  •   Werner Altewischer    13 年前

    如果你这样做的话,我发现它是有效的(见下文)。关键是使用以下方法: - [NSDateFormatter getObjectValue:forString:range:error:]

    而不是

    -[NSDateFormatter dateFromString]

    完整代码:

    + (NSDate *)parseRFC3339Date:(NSString *)dateString 
    {
        NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
        [rfc3339TimestampFormatterWithTimeZone setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
        [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    
        NSDate *theDate = nil;
        NSError *error = nil; 
        if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
            NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
        }
    
        [rfc3339TimestampFormatterWithTimeZone release];
        return theDate;
    }
    
        2
  •  8
  •   deanWombourne    10 年前

    您的设备设置为24小时或12小时制?

    这听起来像是一个疯狂的问题,但我刚刚遇到了这个错误-DateFormatter将根据当前的区域设置(包括时间格式设置)调整您的格式字符串。

    您可以通过添加以下行强制它忽略它们:

    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    

    希望有帮助。

        3
  •  5
  •   WrightsCS    14 年前

    如Atomriot所述,此代码将删除多余的冒号:

    转换自:

    • NSString *stringDate = @"2010-06-21T20:06:36+00:00";

    到:

    • NSString *stringDate = @"2010-06-21T20:06:36+0000";
    // Remove colon in timezone as iOS 4+ NSDateFormatter breaks
    if (stringDate.length > 20) {
        stringDate = [stringDate stringByReplacingOccurrencesOfString:@":"
                                                           withString:@""
                                                              options:0
                                                                range:NSMakeRange(20, stringDate.length-20)];
    }
    

    有关详细信息,请参阅: https://devforums.apple.com/thread/45837

        4
  •  2
  •   Elfred    14 年前

    我最近碰到这个问题。最后我使用了彼得·霍西的ISO8601解析器。这里有: http://boredzo.org/iso8601unparser/

        5
  •  2
  •   J Bryan Price    14 年前

    苹果的文档看起来很“棘手”。

    格式字符串使用格式 模式来自 Unicode 标准 (参考版本 Tr35-6 对于Mac OS X v10.5; 对于Mac OS X v10.4 使用版本 tr35-4 )

    网间网操作系统 :v10.0兼容模式为 不适用于iOS_ 十点四 模式可用。

    根据版本 Tr35-4 :

    对于GMT格式使用1,对于RFC822使用2

    Z{ 1 } GMT-08:00
    Z{ 2 } - 0800

    但是根据 统一码 标准:

    RFC822使用一到三个字母,GMT格式使用四个字母。

    Z{1,3}- 0800
    格林尼治标准时间08:00

    所以看起来iOS 4正在使用 Tr35-6 -Unicode标准,这就是为什么 +00 现在对“z”失败了。

    我试过 -08:00 我的nsdateFormatter里的“zzzz”和它 失败 在iOS 4中。 GMT-0800 不过,确实起了作用。现在似乎需要时区(GMT),而不是像iOS 3中那样可选。

        6
  •  1
  •   AtomRiot    14 年前

    我得到的格式在RFC822和格林尼治标准时间之间。如果我将“+00:00”更改为“+0000”,那么我可以在我的格式上使用“Z”。如果我把它改成“格林尼治标准时间+00:00”,我就可以用zzz正确地获取数据。似乎有什么东西已经被剥离出来,以处理这个混合,因为它以前是为我与OS 3.x工作。

        7
  •  1
  •   dandan78 Tom Cool    12 年前

    我从数据格式中获取值 @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'hh:mm" ;

        8
  •  0
  •   Ben S    14 年前

    我觉得不错。

    它在真实设备上是否仍然正常工作?

    如果是这样,请为模拟器提交一个bug报告,否则为iOS4提交一个bug报告。

        9
  •  0
  •   Jeff Zacharias    14 年前

    我只是在调试这个完全相同的问题。我和你有相同的日期字符串,在3.x而不是4.0中工作。同样的症状。

    查看nsdateFormatter文档时,我看到:

    初始化日期格式化程序 “init在iPhone OS 2.0到iPhone OS 3.2中提供

    这表示init方法已被iOS 4.0弃用。我不知道那是什么意思。

        10
  •  0
  •   user380563    14 年前

    埃尔弗雷德发布的链接成功了。我在将我的应用程序从3.1.3转换为ios4时偶然发现了同样的问题。链接包含了iso8601dateformiter类,它是比我自己的日期实用程序类更好的扩展。

    埃尔弗雷德写道:我最近碰到这个问题。最后我使用了彼得·霍西的ISO8601解析器。这里有: http://boredzo.org/iso8601unparser/

        11
  •  0
  •   John Franklin    14 年前

    看来nsdateformator变得非常挑剔了。

    -(void)dateFormatterTests {
        NSDateFormatter *formatter;
    
        formatter = [[NSDateFormatter alloc] init];
    
    #ifdef WORKS
        [formatter setDateFormat:@"yyyy-MM-dd"];
    #elif defined(ALSO_WORKS)
        [formatter setDateFormat:@"yyyy MM dd"];
        [formatter setLenient:YES];
    #else // DOESN'T WORK
        [formatter setDateFormat:@"yyyy MM dd"];
    #endif
    
        // Works per comments above
        NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13"]);  
        // Never works with any of the above formats
        NSLog(@"dFS: %@", [formatter dateFromString:@"2010-01-13 22:00"]); 
    
        [formatter release]; formatter = nil;
    }
    
        12
  •  0
  •   Community CDub    7 年前

    我的应用程序也有同样的问题 Null Value from NSDateFormatter .

    我发现我的问题是:

    我给我的应用程序发送了这样的日期和时间: 07/16/2010 04:21:00 +00:00 像这样的格式化程序: [dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss ZZZ"]

    好像是 ZZZ 格式化的一部分不再接受冒号:在时间上。

    作品: 07/16/2010 04:21:00 +0000

    不起作用: 2010年7月16日04:21:00+00:00

    为了支持当前的应用程序,我所做的就是搜索 +00:00 插入字符串并替换为 +0000 .

    希望这能帮助别人。

        13
  •  0
  •   chunkyguy    14 年前

    我使用它的简单方法如下:

    date_formatter = [[NSDateFormatter alloc] init];
            [date_formatter setDateStyle:NSDateFormatterShortStyle];
            [date_formatter setTimeStyle:NSDateFormatterNoStyle];
    

    这很管用。我不明白,当nsdateFormatter类从nsObject子类化时,它们如何取消初始化方法。