2010-06-07 1 views
13
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 равен нулю. Может кто-нибудь подскажет мне? Этот код работал.Что случилось с тем, как я использую NSDateFormatter?

UPDATE: Невозможно говорить о том, почему это не работает из-за NDA. Достаточно сказать, что когда iOS 4 выйдет, я отправлю ответ на свой вопрос.

+0

Вы используете «NSString dateString» и «NSDate eventDate» или вы имели в виду «NSString * dateString» и «NSDate * eventDate»? – Dre

+0

Хороший улов ... Это не настоящий код, скопированный дословно. Я не хотел давать слишком много контекста в приложении. –

+0

Я думаю, вы должны написать dd вместо d в setDateFormat, попробуйте. – harshalb

ответ

4

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

@"EEE, d MMM yyyy HH:mm:ss zzz" 

, когда он должен был быть:

@"EEE, dd MMM y HH:mm:ss zzz" 

Часть о iOS 4 и NDA заключалась в том, что я думал, что должен использовать метод NSDateFormatterdateFormatFromTemplate:options:locale:, который выглядел бы так:

NSString *format = [NSDateFormatter dateFormatFromTemplate:@"EEE, d MMM yyyy HH:mm:ss zzz" options:0 locale:[NSLocale currentLocale]]; 

Однако этот метод следует использовать только тогда, когда вы хотите, чтобы отобразить дату для пользователя неизвестной местности. В моем случае я точно знал, как будет выглядеть формат даты, и я пытался PARSE строку даты, чтобы я мог хранить ее в CoreData. Поэтому этот метод не был полезен.

Bonus закладки: Прочитайте эту таблицу очень тщательно, и вы обязательно выяснить, в чем проблема ... Unicode форматы даты должны следовать этим требованиям: http://unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table

TL; DR Строка формата ошиблась , D'о!

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"]; 
    } 

Edit:

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

NSDate *result = nil; 
NSError *error = nil; 
[dataFormatter getObjectValue:&result forString:dateString errorDescription:&error]; 
+0

Использование одного E не сработало. Я попробую тот, который у вас есть для RSS, поскольку он поступает из RSS-канала. –

+0

Да, это тоже не сработало ... Я думаю, что это может быть что-то сломано в бета-версии iOS 4. Причина, по которой это так расстраивает, заключается в том, что она работала просто отлично! Защищено NDA, хотя, я думаю, это все на данный момент. –

+0

Я получаю следующее сообщение об ошибке: «Операция не может быть выполнена. (Ошибка какао 2048.)» –

3

Полный список спецификаторов формата является UTS#35 Date Format Patterns.

Работает ли символ «c» вместо «E»? В документе это очень близкая альтернатива, и это может привести к желаемому результату.

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

0

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

[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

К сожалению, это не проблема в коде для вопроса. Как вы можете видеть, дата жестко закодирована для примера. Ваше решение может помочь некоторым людям! –

0

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

Смежные вопросы