14
   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 发布时,我会发布我自己问题的答案。

4

5 回答 5

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];
于 2010-06-07T22:26:48.413 回答
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]];

但是,仅当您想向未知语言环境的用户显示日期时才应使用该方法。就我而言,我确切地知道日期格式会是什么样子,我试图解析日期字符串,以便可以将其存储在 CoreData 中。因此,该方法没有用。

额外书签:仔细阅读此表,您一定会找出问题所在... Unicode 日期格式应遵循以下规范:http ://unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table

TL;DR格式字符串错误。哦!

于 2011-08-11T20:46:38.977 回答
3

格式说明符的完整列表是UTS#35 Date Format Patterns

'c' 字符可以代替 'E' 工作吗?该文档将其作为非常接近的替代方案,它可能会产生您想要的结果。

(如果您真的想要格式字符串中不在表格中的字符,您可以将它们转义,例如hh 'o''clock' a, zzzz- 生成格式如“12 o'clock PM, Pacific Daylight Time”。)

于 2010-06-07T23:06:06.063 回答
0

你有一个零填充日,即08在你的日期字符串中,但是在你的格式字符串中,格式试图解析一个非零填充日,即d. 更改ddd应该可以解决问题

于 2013-03-01T17:23:55.757 回答
0

我发现的问题是我正在解析的字符串有一些尾随字符“\n\t\t”。解决方案是删除它们:

[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

于 2010-07-24T04:41:14.177 回答