Подтвердить что ты не робот

Преобразование часовых поясов 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, который не обрабатывается должным образом в формате выше. Любые предложения?

4b9b3361

Ответ 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];
}

Ответ 6

Это единственное решение, которое сработало для меня:

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