Разные NSDate для одного и того же графика времени в версиях ios (ios 6 и iOS7)

#objective-c #ios7 #ios6 #nsdate #nsdateformatter

#objective-c #ios7 #ios6 #nsdate #nsdateformatter

Вопрос:

Я столкнулся с этой странной проблемой, когда один из методов в моем коде возвращает разные даты для одного и того же значения временной метки в разных версиях ios.

Ниже приведен код для этого метода.

  (NSDate *)getDateFromTheTimeStampAsDate:(NSInteger)timeStamp
{
    NSLog(@"Timestamp - %d",timeStamp);
    NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [dateFormatter setLocale:usLocale];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"PST"]];
    [dateFormatter setDateFormat:@"MMM DD,yyyy"];

    return [dateFormatter dateFromString:[dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:timeStamp]]];
}
  

Для timestamp = 1361581013 ниже приведены значения NSDates, возвращаемые из вышеуказанной функции:

iOS6 — 2013/02/01 iOS7 — 2013/02/22

Что-то не так с этим кодом?

Обновление: я забыл посмотреть формат даты ранее. Благодаря одному из комментариев мне удалось получить правильную дату. Это было частью устаревшего кода, поэтому в решил просто удалить его и использовать следующее:

  [NSDate dateWithTimeIntervalSince1970:timeStamp];
  

Комментарии:

1. Пожалуйста, приведите примеры выходных данных.

2. Почему вы конвертируете [NSDate dateWithTimeIntervalSince1970:timeStamp] в строку и обратно в дату? — И DD , вероятно, должно быть dd для «дня месяца».

3. Этот формат даты не выдает строку даты, которую вы показываете. Покажите нам реальный формат даты и реальный результат.

4. (Держу пари, что в вашем реальном формате даты используется ГГГГ, а не гггг или что-то подобное.)

5. (Да, DD — это «день года» и явно неверно. Всегда обращайтесь к спецификации , если вы хоть немного не уверены в формате.)

Ответ №1:

Во-первых, вывод никогда не приближается к дате. На терминале попробуйте date -r 1361581013. По крайней мере, тогда вы сможете увидеть, приближаетесь ли вы.

Во-вторых, преобразуйте временную метку в NSDate. Регистрируйте, чтобы увидеть, закрыто ли оно.

     NSDate *d = [NSDate dateWithTimeIntervalSince1970:1361581013] ;
    NSLog(@"d = %@" , d) ;
  

В-третьих, после того, как вы узнаете, что получаете NSDate, примените к нему форматы.

     NSDateFormatter *df = [[NSDateFormatter alloc] init];
    df.dateStyle = NSDateFormatterLongStyle;
    df.timeStyle = NSDateFormatterLongStyle;

    df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"PST" ];
    NSLog(@"d with formatting 1 = %@" , [df stringFromDate:d]) ;

    df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"EST" ];
    NSLog(@"d with formatting 1 = %@" , [df stringFromDate:d]) ;

    df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT" ];
    NSLog(@"d with formatting 1 = %@" , [df stringFromDate:d]) ;
  

Тогда вы будете знать, что все сделали правильно.

 d = 2013-02-23 00:56:53  0000
d with formatting 1 = February 22, 2013 at 4:56:53 PM PST
d with formatting 1 = February 22, 2013 at 7:56:53 PM EST
d with formatting 1 = February 23, 2013 at 12:56:53 AM GMT