#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, я рад, что у тебя все получилось. Если это правильный ответ, можете ли вы пометить его как таковой?