Что не так с тем, как я использую NSDateFormatter? - PullRequest
13 голосов
/ 08 июня 2010
   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 ]

64 голосов
/ 08 июня 2010
/*
    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"];
    }

Edit:

Я использую getObjectValue: вместо dateFromString.

NSDate *result = nil;
NSError *error = nil;
[dataFormatter getObjectValue:&result forString:dateString errorDescription:&error];
4 голосов
/ 12 августа 2011

Ответ на этот вопрос следующий: Я использовал неправильную строку формата даты:

@"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 Неправильная строка формата. D'ой!

3 голосов
/ 08 июня 2010

Полный список спецификаторов формата: UTS # 35 Шаблоны формата даты .

Работает ли символ 'c' вместо 'E'? У документа есть очень близкая альтернатива, и он может дать желаемый результат.

(Если вы действительно хотите, чтобы символы в строке формата, которых нет в таблице, вы можете экранировать их, например, hh 'o''clock' a, zzzz - создает формат, например «12:00 PM, Pacific Daylight Time».)

0 голосов
/ 01 марта 2013

у вас есть заполненный нулями день, а именно 08 в вашей строке даты, однако в вашей строке формата формат пытается проанализировать ненулевой дополненный день, а именно d. изменение d на dd должно решить проблему

0 голосов
/ 24 июля 2010

Проблема, которую я обнаружил, состоит в том, что строка, которую я анализировал, имеет некоторые завершающие символы "\ n \ t \ t". Решение было удалить их:

[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

...