setDefaultTimeZone не работает

#ios #sdk #nsdate #nstimezone

#iOS #sdk #nsdate #nstimezone

Вопрос:

Я нашел только очень старые записи о setDefaultTimeZone в iOS SDK, но не нашел решения проблемы, что setDefaultTimeZone просто ничего не делает.

 NSTimeZone *germanTimeZone = [NSTimeZone timeZoneWithName:@"Europe/Berlin"];
[NSTimeZone setDefaultTimeZone:germanTimeZone];
NSLog(@"Berlin time: %@", [[NSDate date] descriptionWithLocale:nil]);
  

Это должно привести к чему-то вроде:

 Berlin time: 2014-06-30 15:58:34  0200
  

Но это приводит просто к:

 Berlin time: 2014-06-30 15:58:34  0000
  

Заранее благодарю вас за любую подсказку или решение.

Редактировать: Хорошо, ниже приведен мой рабочий код.

 NSTimeZone *germanTimeZone = [NSTimeZone timeZoneWithName:@"Europe/Berlin"];
[NSTimeZone setDefaultTimeZone:germanTimeZone];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy hh:mma"];
NSLog(@"Time: %@", [dateFormatter stringFromDate:[NSDate date]]);
  

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

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

2. Для меня это имеет смысл, большое вам спасибо.

3. @spassas это неправда. Значение NSDate изменится , если вы измените часовой пояс по умолчанию. Протестировано в симуляторе и игровой площадке.

4. @Dan «Объекты NSDate инкапсулируют один момент времени, независимо от какой-либо конкретной календарной системы или часового пояса» из ссылки на NSDate

5. @spassas Я не уверен, что эта ссылка на документацию NSDate опровергает здесь, но вы можете попробовать это сами. Значение NSDate изменится , если вы измените часовой пояс. Конечно, он не содержит данных о часовом поясе, но значение даты изменится.

Ответ №1:

Попробуйте это:

 NSTimeZone* UTC = [NSTimeZone timeZoneWithName:@"UTC"];
[NSTimeZone setDefaultTimeZone:UTC];
  

И для печати используйте NSDateFormatter:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"Europe/Berlin"];
[dateFormatter setDateFormat:@"MM/dd/yyyy hh:mma"];
NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]);
  

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

1. Большое вам спасибо, я думаю, что вышеуказанному требуется указанный dateformat, иначе вывод был бы пустым. Я добавляю свой рабочий код выше.

2. @Sven, я рад, что у тебя все получилось. Если это правильный ответ, можете ли вы пометить его как таковой?