#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