Как разбирать строку даты в объекте NSDate в iOS?
Я пытаюсь проанализировать строку даты из 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];
}
Ответы
Ответ 1
Вам не нужно столько одиночных кавычек, сколько у вас (необходимо только для символов не даты/времени), поэтому измените это:
[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/
Ответ 2
У меня были те же проблемы с двоеточием в конце. Здесь функция, которую я использовал для нормализации даты, чтобы сделать 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:@""];
}
Ответ 3
Мне потребовалось некоторое время, чтобы найти простой ответ для этого. и есть много решений, связанных с привлечением дополнительного стороннего кода.
Для тех, кто борется с этим сейчас и поддерживает только iOS 6 и выше.
Вы можете установить формат даты для
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]
И это будет правильно обрабатывать "-05: 00" с помощью двоеточия.
Ответ 4
Решения должны быть изменены:
[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
К этим обозначениям:
[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
Надеюсь, это поможет вам.
Ответ 5
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"];
Ответ 6
Проблема заключается в "Z" в конце. Как вы пишете его в кавычках, ваш парсер ожидает буквального символа Z в вашей временной строке, а его нет. Вы хотите, чтобы символ форматирования Z без кавычек указывал, что ваша строка времени содержит информацию о часовом поясе. Что он делает, -05: 00 в конце вашей строки является часовым поясом.
Поскольку вы ожидаете информацию о часовом поясе, установка часового пояса в вашем форматировании даты довольно бессмысленна. И проверьте ссылку на шаблоны форматирования Unicode, эта ссылка содержит окончательную информацию, которой вы должны доверять, прежде всего, ответы, которые вы получаете здесь.
Ответ 7
Начиная с iOS 10 система предоставляет NSISO8601DateFormatter для этого конкретного формата.