Ответ dasblinkenlight абсолютно правильный, но я объясню немного более подробно и покажу шаги в ObjC вместо Swift. Вы не хотите иметь ту же дату в другом часовом поясе; вы хотите то же самое по местному времени (или настенное время): то, что человек увидит, когда посмотрит на часы.
Дата проведения в другую зону имеет разное местное время: Пятница, 8 июля 2016 года в 18:30:00 Индия Стандартное время: является 8 июля 2016 года в 8:00:00 AM Дневное время. В тот момент, когда человек в Калькутте смотрит на часы и видит 6:30 вечера, человек в Омахе, глядя на часы, увидит 8:00.
Во-первых, исключительно для демонстрации мы создадим исходную дату из строки, которую вы указали, используя синтаксический анализатор даты. Вы просто получите дату от своего объекта уведомления.
NSString * originalDateString = @"Friday, July 8, 2016 at 6:30:00 PM India Standard Time";
NSDateFormatter * parser = [NSDateFormatter new];
[parser setDateStyle:NSDateFormatterFullStyle];
[parser setTimeStyle:NSDateFormatterFullStyle];
NSDate * originalDate = [parser dateFromString:originalDateString];
Хотя исходная информация в строку, заключенную часового пояса, дата не. Однако время стены зависит от зоны, поэтому для следующего шага нам понадобится объект часового пояса. Вы тоже получите это из своего объекта уведомления. Здесь мы просто создадим один из его идентификаторов: NSTimeZone * originalTZ = [NSTimeZone timeZoneWithAbbreviation:@"IST"];
Нам необходимо указать NSDateComponents
, чтобы представлять локальные значения времени для данной зоны. NSCalendar
несет ответственность за нарушение даты в эти компоненты:
NSCalendar * cal = [NSCalendar currentCalendar];
NSDateComponents * localComps;
localComps = [cal componentsInTimeZone:originalTZ
fromDate:originalDate];
Если вы проверяете localComps
сейчас, вы увидите значение инкапсулировать время стены вы ожидаете: 2016-07-08 18:30:00. Теперь, когда мы произведем эти значения, мы можем поместить их в другую зону без перевода. То есть, не переосмысливая значения как абсолютное время, которое дало бы 2016-07-08 08:00:00, как обсуждалось выше. Просто измените часовой пояс (опять же, вы получите зону от вашего уведомления, а не от его аббревиатуры):
NSTimeZone * destinationTZ = [NSTimeZone timeZoneWithAbbreviation:@"CDT"];
[localComps setTimeZone:destinationTZ];
Теперь календарь может построить новый объект даты из этих компонентов.NSDate * destinationDate = [cal dateFromComponents:localComps];
*
Эта дата является независимым от часового пояса моментом во времени, который представляет собой пятница, 8 июля 2016 года, в 18:30 по центральному летнему времени. Как и в случае с любым NSDate
, если вы просто распечатаете его, он будет отформатирован в GMT. Если вы хотите увидеть значения времени на стене, которые вы ожидаете, вам нужно использовать форматировщик, установленный в часовой пояс назначения.
* как ответ показывает dasblinkenlight, в localComps
имеет соответствующий календарь, поэтому он способен создать саму дату, тоже. Я думал, это будет немного яснее.
«Я хочу то же время, что и в другой часовой пояс» Нет, нет. Это два раза - разные даты. – matt
@matt Да демонстративно они оба разные даты, но как я могу создать новую или другую дату, выглядящую так же, как date1, но другой часовой пояс –