我如何使用NSDateFormatter有什么问题?

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzz"]; NSString *dateString = @"Tue, 08 Jun 2010 17:00:00 EDT"; NSDate *eventDate = [dateFormatter dateFromString:dateString]; 

在这种情况下,eventDate对象是零。 有人能告诉我吗? 此代码用于工作。

更新:不能谈论为什么这不起作用,由于NDA。 只要说一下,当iOS 4出来时,我会将答案发布到我自己的问题上。

 /* x number xx two digit number xxx abbreviated name xxxx full name a AM/PM A millisecond of day c day of week (c,cc,ccc,cccc) d day of month e day of week (e,EEE,EEEE) F week of month g julian day (since 1/1/4713 BC) G era designator (G=GGG,GGGG) h hour (1-12, zero padded) H hour (0-23, zero padded) L month of year (L,LL,LLL,LLLL) m minute of hour (0-59, zero padded) M month of year (M,MM,MMM,MMMM) Q quarter of year (Q,QQ,QQQ,QQQQ) s seconds of minute (0-59, zero padded) S fraction of second u zero padded year v general timezone (v=vvv,vvvv) w week of year (0-53, zero padded) y year (y,yy,yyyy) z specific timezone (z=zzz,zzzz) Z timezone offset +0000 sql yMd H:m:s rss [E, ]d MMM y[y] H:m:s Z|z[zzz] */ 

这是我对dateparsing的评论。 我使用以下,其中toDateUsingFormat使用NSDateFormatter与传入的string。 我不使用区域设置,因为rssdate不是本地化的。

  if ( 0 == [string rangeOfString:@","].length ) { result = [string toDateUsingFormat:@"d MMM y H:m:sz"]; } else { result = [string toDateUsingFormat:@"E, d MMM y H:m:sz"]; } 

编辑:

我使用getObjectValue:而不是dateFromString

 NSDate *result = nil; NSError *error = nil; [dataFormatter getObjectValue:&result forString:dateString errorDescription:&error]; 

这个问题的答案如下:我使用了错误的date格式string:

 @"EEE, d MMM yyyy HH:mm:ss zzz" 

当它应该是:

 @"EEE, dd MMM y HH:mm:ss zzz" 

关于iOS 4和NDA的一部分是我想我必须使用NSDateFormatter方法dateFormatFromTemplate:options:locale:这将看起来像这样:

 NSString *format = [NSDateFormatter dateFormatFromTemplate:@"EEE, d MMM yyyy HH:mm:ss zzz" options:0 locale:[NSLocale currentLocale]]; 

但是,只有在要将date显示给未知语言环境的用户时才应使用该方法。 在我的情况下,我确切地知道date格式会是什么样子,我正在尝试PARSEdatestring,以便我可以将其存储在CoreData中。 因此,这种方法是没有用的。

奖金书签:仔细阅读这张表,你一定会知道问题是什么… Unicodedate格式应该遵循这些规范: http : //unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table

TL; DR格式string错误。 D'哦!

格式说明符的完整列表是UTS#35date格式模式 。

“c”字符是否代替“E”? 该文件是一个非常接近的select,它可能会产生你想要的结果。

(如果你真的想要格式化string中不在表格中的字符,你可以将它们转义出来,比如hh 'o''clock' a, zzzz – 会产生像“12点PM,Pacific Daylight Time”这样的格式。)

我发现的问题是,我正在parsing的string有一些尾随的字符“\ n \ t \ t”。 解决办法是去除它们:

[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

你有一个零填充的一天,即在你的datestring中的08 ,但是在你的格式string格式试图parsing一个非零填充天,即d 。 将d更改为dd应该可以解决问题