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对象为nil。有人能告诉我吗?这段代码以前都有用。
更新: 无法谈论为什么由于NDA而无效。我只想说,当iOS 4出局时,我会将答案发给我自己的问题。
答案 0 :(得分:64)
/*
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 y-M-d H:m:s
rss [E, ]d MMM y[y] H:m:s Z|z[zzz]
*/
这是我对日期解析的评论。我使用以下内容,其中toDateUsingFormat
使用带有传入字符串的NSDateFormatter
。我没有使用语言环境,因为rss日期没有本地化。
if ( 0 == [string rangeOfString:@","].length ) {
result = [string toDateUsingFormat:@"d MMM y H:m:s z"];
} else {
result = [string toDateUsingFormat:@"E, d MMM y H:m:s z"];
}
编辑:
我使用getObjectValue:
代替dateFromString
。
NSDate *result = nil;
NSError *error = nil;
[dataFormatter getObjectValue:&result forString:dateString errorDescription:&error];
答案 1 :(得分:4)
这个问题的答案如下: 我使用了错误的日期格式字符串:
@"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]];
但是,只有在您希望将日期显示给未知语言环境的用户时才应使用该方法。在我的情况下,我确切地知道日期格式的样子,我试图将日期字符串PARSE,以便我可以将它存储在CoreData中。因此,该方法无用。
奖励书签:仔细阅读此表,您一定会弄清楚问题是什么...... Unicode日期格式应遵循以下规范:http://unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table
TL; DR 格式字符串错误。 D'哦!
答案 2 :(得分:3)
格式说明符的完整列表是UTS#35 Date Format Patterns。
'c'字符是否代替'E'?该文档将其作为一种非常接近的替代方案,它可以产生您想要的结果。
(如果你真的希望格式字符串中的字符不在表中,你可以将它们转义为hh 'o''clock' a, zzzz
- 产生的格式如“下午12点,太平洋夏令时”。)
答案 3 :(得分:0)
答案 4 :(得分:0)
你的日期字符串为零填充日,即08
,但是在格式字符串中,格式正在尝试解析非零填充日,即d
。将d
更改为dd
可以解决问题