26

我在 OS 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]);

但现在在 iOS4 模拟器下最新的 xcode 3.2.3 中,变量 theDate 为 nil。

我查看了类参考,并没有看到使用这些特定方法为 iOS4 弃用或实现的任何内容。我遗漏了什么?

4

13 回答 13

41

我发现如果你这样做,它会起作用(见下文)。关键是使用方法: - [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;
}
于 2010-10-19T12:43:34.040 回答
8

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

这听起来像是一个疯狂的问题,但我刚刚遇到了那个错误 - dateformatter 将根据当前的语言环境调整您的格式字符串,其中包括时间格式设置。

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

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

希望有帮助。

于 2010-06-22T16:09:17.783 回答
5

此代码将删除 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

于 2010-08-21T11:29:05.387 回答
2

我最近遇到了这个问题。我最终使用了 Peter Hosey 的 ISO8601 解析器。可在此处获得:http: //boredzo.org/iso8601unparser/

于 2010-06-26T17:05:52.450 回答
2

Apple 文档似乎很“棘手”:

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

iOS:v10.0 兼容模式在 iOS 上不可用,只有10.4 模式可用。

根据版本tr35-4

使用 1 表示 GMT 格式,2 表示 RFC 822

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

但根据Unicode标准:

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

Z{1,3} -0800
Z{4} GMT-08:00

所以看起来 iOS 4 正在使用tr35-6 - Unicode 标准,这就是+00:00现在对“Z”失败的原因。

我在我的 NSDateFormatter 中尝试了-08:00针对“ZZZZ”,但它在 iOS 4 中失败了。但是,GMT-08:00确实有效。现在似乎需要时区 (GMT),而不是像在 iOS 3 中那样是可选的。

于 2011-02-08T20:44:00.607 回答
1

我从 dataFormat 得到值@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'hh:mm"

于 2010-06-26T17:56:20.700 回答
1

我得到的格式介于 RFC 822 和 GMT 之间。如果我将“+00:00”更改为“+0000”,那么我可以在格式上使用“Z”。如果我将其更改为“GMT+00:00”,那么我可以使用 ZZZZ 正确获取数据。似乎已经剥离了一些东西来处理这种混合,因为它以前在 OS 3.x 上为我工作。

于 2010-07-08T20:59:32.030 回答
0

在我看来很好。

它在真实设备上仍然可以正常工作吗?

如果是,请为模拟器提交错误报告,否则为 iOS 4 提交错误报告。

于 2010-06-22T15:58:13.273 回答
0

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

查看 NSDateFormatter 文档时,我看到:

初始化日期格式化程序 - init 在 iPhone OS 2.0 到 iPhone OS 3.2 中可用

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

于 2010-06-27T02:55:32.133 回答
0

Elfred 发布的链接起到了作用。在将我的应用程序从 3.1.3 转换到 iOS4 时,我偶然发现了同样的问题。该链接包含 ISO8601DateFormatter 类,这是一个比我自己的日期实用程序类更出色的扩展。

Elfred 写道: 我最近遇到了这个问题。我最终使用了 Peter Hosey 的 ISO8601 解析器。可在此处获得:http: //boredzo.org/iso8601unparser/

于 2010-06-30T22:05:24.663 回答
0

似乎 NSDateFormatter 变得非常挑剔。

-(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;
}
于 2010-07-10T20:47:35.530 回答
0

我的应用程序以及NSDateFormatter 的 Null Value也遇到了同样的问题。

我发现我的问题如下:

我正在向我的应用程序发送这样的日期和时间: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

不起作用:07/16/2010 04:21:00 +00:00

为了支持当前已发布的应用程序,我所做的只是搜索+00:00字符串中的部分并将其替换为+0000.

希望这可能对其他人有所帮助。

于 2010-07-21T12:52:04.947 回答
0

我使用它很简单:

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

这很好用。当 NSDateFormatter 类是从 NSObject 子类化时,我不明白他们如何弃用 init 方法

于 2010-11-02T11:16:23.687 回答