Форматирование даты из времени сервера в местное время с использованием NSTimeZone и Dateformatter

Я получаю дату/время в виде NSString с моего сервера, где я конвертирую это время в NSDate в локальное время пользователей, используя NSTimeZone. После чего я пытаюсь переформатировать этот NSDate в более читаемую NSString, используя новый формат NSDateFormatter, однако, когда я пытаюсь применить этот новый формат, он возвращает полученную строку даты обратно к исходному серверному времени.

Я хотел бы знать, что я делаю неправильно, я хотел бы показать преобразованное время в новом формате.

это код, который я использую

// set date format
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // change time to systemTimeZone
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    [dateFormatter setTimeZone:timeZone];
    NSDate *localTime = [dateFormatter dateFromString:[singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]];


    // reformat converted Time to readable format
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
    [dateFormat1 setDateFormat:@"dd/MM/yy - hh:mm a"];
     NSString *dateWithNewFormat = [dateFormat1 stringFromDate:localTime];


    NSLog(@"TimeZone - %@", timeZone);
    NSLog(@"UTC ServerTime - %@", [singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]);

    NSLog(@"UTC to deviceTimeZone - %@", localTime);
    NSLog(@"NewFormat - %@", dateWithNewFormat);

Это пример моего вывода

TimeZone - Pacific/Auckland (NZST) offset 43200
UTC ServerTime - 2013-08-22 01:45:59
UTC to deviceTimeZone - 2013-08-21 13:45:59 +0000
NewFormat - 22/08/13 - 01:45 AM

любая помощь будет принята с благодарностью


person HurkNburkS    schedule 22.08.2013    source источник
comment
В каком часовом поясе указана дата, которую дает вам ваш сервер? Вам нужно установить часовой пояс вашего первого NSDateFormatter в часовой пояс сервера, чтобы NSDateFormatter интерпретировал строку в часовом поясе сервера. Таким образом, когда вы получите результат NSDate, он будет представлять правильный момент времени (обратите внимание, что объекты NSDate не обращают внимания на часовые пояса, они представляют определенные моменты времени независимо от часовых поясов, перехода на летнее время и т. д.). Когда вы правильно проанализировали конкретный момент, вы можете представить этот конкретный момент по местному времени, используя второй модуль форматирования даты.   -  person dreamlax    schedule 22.08.2013
comment
хорошо .. так что часовой пояс, на который настроен мой сервер, - UTC   -  person HurkNburkS    schedule 22.08.2013
comment
это сработало. Я установил для dateFormatter значение UTC, затем для dateFormatter1 было установлено значение timeZone.. работало отлично :) Мне просто нужно изменить имена переменных, чтобы немного лучше представлять мои данные. :) Спасибо за помощь   -  person HurkNburkS    schedule 22.08.2013
comment
Объект NSDate содержит (или должен содержать, если он создан правильно) значение GMT/UTC даты/времени. Получение времени в вашем местном часовом поясе - это работа средства форматирования даты. Вы не изменяете объект NSDate, чтобы установить часовой пояс.   -  person Hot Licks    schedule 22.08.2013


Ответы (1)


NSDateFormatter, который считывает дату, должен быть установлен в часовой пояс, в котором находится дата, которую вы анализируете, в вашем случае это UTC. После этого средство форматирования даты сможет создать объект NSDate (который представляет определенный момент времени независимо от часовых поясов). Затем вы можете передать этот объект NSDate другому NSDateFormatter, настроенному на форматирование дат в определенном часовом поясе.

// set date format
NSDateFormatter *dateParser = [[NSDateFormatter alloc] init];
dateParser.dateFormat = @"yyyy-MM-dd HH:mm:ss";
dateParser.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSDate *specificMomentInTime = [dateParser dateFromString:[singleInstanceActivationHistoryDictionay objectForKey:@"ActivationTime"]];

// reformat converted Time to readable format
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd/MM/yy - hh:mm a";
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
NSString *dateWithNewFormat = [dateFormatter stringFromDate:specificMomentInTime];

NSLog(@"UTC ServerTime - %@", specificMomentInTime);
NSLog(@"NewFormat - %@", dateWithNewFormat);
person dreamlax    schedule 22.08.2013