Разбор неподдерживаемых форматов даты через Cocoa NSDate

С инфраструктурой Cocoa, как я могу разобрать @ "2008-12-29T00: 27: 42-08: 00" в объект NSDate? Стандарт -dateWithString: не нравится.

Ответы

Ответ 1

Вы можете использовать NSDateFormatter для анализа дат:

    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    date = [dateFormatter dateFromString:dateStr];

шаблоны формата даты Unicode определяет строку формата, которую вы можете использовать с помощью метода setDateFormat:.

Обратите внимание, что если вы настроите таргетинг на 10.4, вам необходимо позвонить: [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];. Не требуется для iphone или леопарда, поскольку этот режим по умолчанию там.

Ответ 3

На самом деле вам нужно установить часовой пояс, календарь и локаль. Если вы не устанавливаете локаль, у пользователя есть время AM/PM, форматировщик добавит маркер AM/PM! Если вы не установите часовой пояс, он будет использовать текущий часовой пояс, но будет отмечать его как "Z" ( "Зулу" или GMT). Если вы не зададите календарь, пользователи с японским императорским календарем будут иметь количество лет с момента нынешнего Вознесения Императора вместо количества лет с тех пор, как родился Иисус Христос. Обязательно проверьте во всех сценариях, о которых я говорил!

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
    NSString * str = [f stringFromDate:someDate];
    NSDate * date = [f dateFromString:dateStr];

Ответ 4

Как изменен часовой пояс с ios 5 на ios 6. iOS 6 поддерживает формат +01: 00 с помощью ZZZZZ, но ios 5 - нет. Я решил эту проблему с этим решением, которое помогло мне разобрать дату со следующим форматом в ios 5 и 6.

2013-05-07T00: 00: 00 + 01: 00

NSMutableString *newDate = [date mutableCopy];
NSRange range;
range.location = 22;
range.length = 1;
[newDate replaceCharactersInRange:range withString:@""];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZ"];    
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:newDate];