Разбор неподдерживаемых форматов даты в NSDate Cocoa - PullRequest
13 голосов
/ 30 декабря 2008

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

Ответы [ 4 ]

31 голосов
/ 30 декабря 2008

Вы можете использовать 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 или леопарда, так как этот режим используется по умолчанию.

6 голосов
/ 31 мая 2011

На самом деле вам нужно установить часовой пояс, календарь и локаль. Если вы не установили локаль, у пользователя включено время AM / PM, то средство форматирования добавит маркер AM / PM! Если вы не установите часовой пояс, он будет использовать текущий часовой пояс, но пометит его как «Z» («Zulu» или 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];
6 голосов
/ 30 декабря 2008

Если вам нужно обрабатывать только формат ISO 8601 (примером которого является эта строка), вы можете попробовать мой анализатор ISO 8601 и его разбор .

1 голос
/ 31 октября 2012

Способ установки часового пояса изменен с 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...