Ответ dasblinkenlight абсолютно правильный, но я объясню немного подробнее и покажу шаги в ObjC вместо Swift. Вам не нужна та же дата в другом часовом поясе; вам нужно то же самое местное время (или время на стене): то, что человек увидит, когда посмотрит на часы.
Та же дата в другом поясе имеет другое местное время: пятница, 8 июля 2016 г., 18:30:00 Стандартное время Индии наступает пятница, 8 июля 2016 г., 8:00:00. Центральное летнее время. В тот момент, когда человек в Калькутте смотрит на часы и видит 18: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:00 по центральному летнему времени. Как и в случае с любым NSDate
, если вы просто распечатаете его, он будет отформатирован по Гринвичу. Если вы хотите увидеть ожидаемые значения времени на стене, вам нужно использовать средство форматирования, установленное для часового пояса назначения.
* Как показывает ответ dasblinkenlight, localComps
имеет связанный календарь, поэтому он также может сам создавать дату. Я думал, что это будет немного яснее.
person
jscs
schedule
09.07.2016