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

时间:2010-06-07 22:16:42

标签: iphone objective-c nsdateformatter ios

   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出局时,我会将答案发给我自己的问题。

5 个答案:

答案 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可以解决问题