NSDateFormatter在OS 4.0中返回零

我有以下代码在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中,variablestheDate是零。

我已经查看了类的引用,并没有看到任何不赞成使用这些特定的方法iOS4或不同的实现。 我放弃了什么?

如果你这样做,我发现它的工作原理(见下文)。 关键是使用方法: - [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; } 

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

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

你可以强制它通过添加这一行来忽略它们:

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

希望有所帮助。

这段代码将像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

我最近碰到这个问题。 我最终使用了Peter Hosey的ISO8601parsing器。 它可以在这里find: http : //boredzo.org/iso8601unparser/

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

格式string使用Unicode标准的格式模式(此参考针对Mac OS X v10.5的版本tr35-6 ; Mac OS X v10.4使用版本tr35-4 )。

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

根据版本tr35-4

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

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中。

我给出的格式是RFC 822和GMT之间的一半。 如果我将“+00:00”更改为“+0000”,那么我可以在我的格式上使用“Z”。 如果我将其更改为“GMT + 00:00”,则可以使用ZZZZ正确获取数据。 看来有些东西已经被剥离出来处理这个混合,因为它以前用OS 3.x为我工作。

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

对我看起来很好。

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

如果是这样的文件模拟器的错误报告,否则为iOS 4提交错误报告。

我只是debugging这个完全相同的问题。 我有相同的datestring,你在3.x而不是4.0。 同样的症状。

查看NSDateFormatter文档时,我看到:

初始化date格式化程序 – init可在iPhone OS 2.0到iPhone OS 3.2中使用

这就是说,iOS 4.0的init方法已经被弃用了。 我不确定这是什么意思。

Elfred发布的链接做了诀窍。 我偶然发现同样的问题,同时将我的应用程序从3.1.3转换到iOS4。 该链接持有ISO8601DateFormatter类,这是一个非常优秀的扩展,然后我自己的date实用程序类。

埃尔弗雷德写道:我最近碰到这个问题。 我最终使用了Peter Hosey的ISO8601parsing器。 它可以在这里find: http : //boredzo.org/iso8601unparser/

看来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; } 

我的应用程序中有相同的问题,以及NSDateFormatter的Null Value 。

我发现我的问题如下:

我发送我的应用程序date和时间是这样的: 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

为了支持当前的应用程序,我所做的只是searchstring中的+00:00部分,并将其replace为+0000

希望这可以帮助别人。

我使用它很简单:

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

这很好。 我不明白他们如何可以不赞成init方法,当NSDateFormatter类从NSObject的子类