Как разобрать строку даты в объект NSDate в iOS? - PullRequest
48 голосов
/ 15 февраля 2011

Я пытаюсь проанализировать строку даты из xml в объект NSDate в приложении для iPhone

Я знаю, что об этом, должно быть, спрашивали раньше, однако я считаю, что у меня правильный синтаксис, ноне работает.Есть ли проблема с моим кодом?

Строка даты, которую мне нужно проанализировать:

2011-01-21T12:26:47-05:00

Код, который я использую для анализа:

self.dateFormatter = [[NSDateFormatter alloc] init];
    [self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];



... 

else if([elementName isEqualToString:kUpdated]){
    self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ];
}

Любая помощь с благодарностью.Спасибо!

** Основываясь на ссылке ссылки от ChrisKent, я исправил проблему следующим образом:

else if([elementName isEqualToString:kLastOnDeck]){

    NSString *dateStr = self.currentParsedCharacterData;
    // we need to strip out the single colon
    dateStr = [dateStr stringByReplacingOccurrencesOfString:@":" 
                                                 withString:@"" 
                                                    options:0 
                                                      range:NSMakeRange([dateStr length] - 5,5)];




    self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr];

}

Ответы [ 7 ]

64 голосов
/ 15 февраля 2011

Вам не нужно почти столько же одинарных кавычек, сколько у вас есть (нужно только для символов, отличных от даты / времени), поэтому измените это:

[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

На это:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
...
self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]];

Документация здесь: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

Шаблоны формата Unicode: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Работа с часовыми поясами с двоеточиями (+00: 00): http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/

3 голосов
/ 25 июня 2015

Мне понадобилось некоторое время, чтобы найти простой ответ на этот вопрос.и есть много решений, которые включают добавление дополнительного стороннего кода.

Для тех, кто борется с этим сейчас и поддерживает только iOS 6 и выше.

Вы можете установить датуот форматера до

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]

И это будет правильно обрабатывать «-05: 00» с двоеточием.

3 голосов
/ 15 февраля 2011

У меня были те же проблемы с толстой кишкой в ​​конце. Вот функция, которую я использовал для нормализации даты, чтобы сделать NSDate счастливым.

/**
 * Timezones are returned to us in the format +nn:nn
 * The date formatter currently does not support IS 8601 dates, so
 * we convert timezone from the format "+07:30" to "+0730" (removing the colon) which
 * can then be parsed properly.
 */
- (NSString *)applyTimezoneFixForDate:(NSString *)date {
    NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch];
    return [date stringByReplacingCharactersInRange:colonRange withString:@""];
}
1 голос
/ 09 мая 2015

Проблема в том, что в конце стоит буква «Z».То, как вы пишете это в кавычках, ваш синтаксический анализатор ожидает буквального символа Z в вашей временной строке, а его нет.То, что вы хотите, это символ Z форматирования без кавычек, который указывает, что ваша строка времени содержит информацию о часовом поясе.Что и происходит, -05: 00 в конце вашей строки - это часовой пояс.

Поскольку вы ожидаете информацию о часовом поясе, установка часового пояса в вашем устройстве форматирования даты довольно бессмысленна.И проверьте ссылку на шаблоны форматирования Unicode, эта ссылка содержит точную информацию, которой вы должны доверять, прежде всего ответы, которые вы получаете здесь.

1 голос
/ 09 мая 2015

ISO8601DateFormatter

Я имел большой успех с этой библиотекой, которая доступна как CocoaPod.

https://github.com/boredzo/iso-8601-date-formatter

Использование

- (ISO8601DateFormatter *)dateFormatter
{
    static ISO8601DateFormatter *dateFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dateFormatter = [[ISO8601DateFormatter alloc] init];
        dateFormatter.includeTime = YES;
    });

    return dateFormatter;
}


NSDate *date = [[self dateFormatter] dateFromString:@"2015-05-09T13:06:00"];
1 голос
/ 30 декабря 2011

Решений стоит изменить:

[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

К этой записи:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];

Надеюсь, это поможет вам.

0 голосов
/ 06 сентября 2017

Начиная с iOS 10, система предоставила NSISO8601DateFormatter доступен для этого конкретного формата.

...