我在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为零。
我查看了类引用,并没有看到任何已弃用或使用这些特定方法对iOS4实现不同的内容。我遗漏了什么?
答案 0 :(得分: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;
}
答案 1 :(得分:8)
您的设备是否设置为24小时或12小时?
这听起来像是一个疯狂的问题,但我遇到了这个错误 - dateformatter会根据当前的语言环境调整你的格式字符串,其中包括时间格式设置。
您可以通过添加以下行来强制它忽略它们:
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
希望有所帮助。
答案 2 :(得分: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
答案 3 :(得分:2)
我最近遇到过这个问题。我最终使用了Peter Hosey的ISO8601解析器。它可以在这里找到:http://boredzo.org/iso8601unparser/
答案 4 :(得分:2)
Apple文档看起来好像是“棘手”:
格式字符串使用格式 来自Unicode标准的模式 (此参考版本为 tr35-6 对于Mac OS X v10.5; 适用于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中对'ZZZZ'尝试 -08:00 ,在iOS 4中失败 GMT-08:00 ,然而,确实有效。现在看来时区(GMT)是必需的,而不是像iOS 3中那样可选的。
答案 5 :(得分:1)
我从dataFormat @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+'hh:mm"
;
答案 6 :(得分:1)
我获得的格式是RFC 822和GMT之间的格式。如果我将“+00:00”更改为“+0000”,那么我可以在格式上使用“Z”。如果我将其更改为“GMT + 00:00”,那么我可以使用ZZZZ来正确获取数据。似乎有些东西已被剥离以处理这种混合,因为它在使用OS 3.x之前一直在为我工作。
答案 7 :(得分:0)
对我来说很好。
它是否仍能在真实设备上正常运行?
如果是,请提交模拟器的错误报告,否则请提交iOS 4的错误报告。
答案 8 :(得分:0)
我只是在调试这个完全相同的问题。我在3.x而不是4.0中使用相同的日期字符串。相同的症状。
查看NSDateFormatter文档时,我看到:
初始化日期格式化程序 - init通过iPhone OS 3.2在iPhone OS 2.0中可用
这表示不推荐使用iOS 4.0的init方法。我不确定这意味着什么。
答案 9 :(得分:0)
Elfred发布的链接完成了这个伎俩。在将我的应用程序从3.1.3转换为iOS4时,我偶然发现了同样的问题。该链接包含ISO8601DateFormatter类,这是一个比我自己的日期实用程序类更优秀的扩展。
Elfred写道:我最近遇到了这个问题。我最终使用了Peter Hosey的ISO8601解析器。它可以在这里找到:http://boredzo.org/iso8601unparser/
答案 10 :(得分: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;
}
答案 11 :(得分:0)
我的应用中也遇到了同样的问题Null Value from NSDateFormatter。
我发现我的问题如下:
我向我的应用发送了这样的日期和时间:07/16/2010 04:21:00 +00:00
,格式化程序如下:[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss ZZZ"]
看起来形成NO LONGER的ZZZ
部分接受冒号:当时。
作品:07/16/2010 04:21:00 +0000
不起作用:07/16/2010 04:21:00 +00:00
为了支持当前的应用,我所做的只是搜索字符串中的+00:00
部分,并将其替换为+0000
。
希望这可能有助于其他人。
答案 12 :(得分:0)
我使用它就像:
date_formatter = [[NSDateFormatter alloc] init];
[date_formatter setDateStyle:NSDateFormatterShortStyle];
[date_formatter setTimeStyle:NSDateFormatterNoStyle];
这很有效。我不明白当NSDateFormatter类是从NSObject生成子类时,他们如何弃用init方法