我使用NSDateFormatter有什么问题?

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对象为nil。有谁能给我指点一下?这段代码以前可以运行。
更新: 由于保密协议无法讨论为什么不起作用。简单来说,当iOS 4发布时,我将发布自己问题的答案。

你是在使用 "NSString dateString" 和 "NSDate eventDate" 还是你的意思是 "NSString *dateString" 和 "NSDate *eventDate"? - Dre
好的,注意到了...这不是逐字复制的实际代码。我不想在应用程序上下文中提供太多信息。 - Thom Mahoney
我认为你应该在 setDateFormat 中写 dd 而不是 d,试一下。 - harshalb
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];

使用单个 E 没有起作用。我将尝试你为 RSS 使用的那个,因为它来自于一个 RSS 源。 - Thom Mahoney
是的,那也不起作用...我认为这可能是iOS 4 Beta中某些东西损坏了。令人沮丧的原因是它以前运行得很好!但受NDA保护,所以现在就只能这样了。 - Thom Mahoney
我得到了以下错误信息: “操作无法完成。(Cocoa 错误2048。)” - Thom Mahoney

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

简而言之,格式字符串错误。D'oh!


3
完整的格式说明列表请参考UTS#35日期格式。 使用“c”字符是否可以替代“E”?文档将其作为非常接近的替代方案,它可能会产生您想要的结果。 (如果您真的希望在格式字符串中包含不在表格中的字符,则可以对它们进行转义,例如hh 'o''clock' a, zzzz - 生成类似于“下午12点,太平洋夏令时间”的格式。)

0

你的日期字符串中有一个零填充的日期,即08,但是在你的格式字符串中,格式正在尝试解析非零填充的日期,即d。将d更改为dd应该可以解决这个问题。


0
我发现的问题是,我正在解析的字符串末尾有一些字符 "\n\t\t"。解决方案是将它们删除:
[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

很遗憾,这并不是问题的代码。正如你所看到的,日期是为了示例而硬编码的。但你的解决方案可能会帮助一些人! - Thom Mahoney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接