Преобразование часовых поясов iPhone NSDateFormatter
Я пытаюсь создать форматтер, который преобразует формат даты, показанный объекту NSDate:
NSString *dateStr = @"2010-06-21T19:00:00-05:00";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDate *date = [dateFormat dateFromString:dateStr];
Проблема заключается в часовом поясе -05: 00, который не обрабатывается должным образом в формате выше. Любые предложения?
Ответы
Ответ 1
Честно говоря, вам просто нужно изменить исходные данные (удаление двоеточия), прежде чем запускать их через форматтер. Ваша исходная строка даты является нестандартной, и ни одна из строк формата часового пояса не будет работать на ней.
Вы можете видеть действительные входы на unicode.org.
ZZZ, например. "-0500"
ZZZZ, например. "GMT-05: 00"
Ничего для "-05: 00"
Ответ 2
Чтобы обработать часовой пояс с двоеточием в нем, вам просто нужно использовать 5 'Z. Это довольно распространенный формат даты, формат ISO-8601. Это будет работать только на iOS 6.x +
-(NSDate *) dateFromString:(NSString *)string {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
return [formatter dateFromString:string];
}
Ответ 3
Может быть, я что-то пропустил, но ZZ
работал у меня.
Я использовал:
@"yyyy-MM-dd'T'HH:mm:ss.SSSZZ"
для
2014-02-27T08:00:00.000+04:00
Ответ 4
Это формат времени по умолчанию, который я получил от бэкэнда Sinatra ActiveRecord. Вот мое решение.
-(NSDate *) dateFromString:(NSString *)string{
NSMutableString * correctedDateString = [[NSMutableString alloc] initWithString:string];
[correctedDateString deleteCharactersInRange: NSMakeRange(22, 1)];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
return [formatter dateFromString:correctedDateString];
}
Ответ 5
5 ZZZZZ - это категория, которую я написал с некоторым образцом от GMT до BST
https://github.com/clearbrian/NSDateFormatter_ISO_8601
Ответ 6
Это единственное решение, которое сработало для меня:
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];