2016-07-09 7 views
1

у меня есть время, дата:NSDate за то же местное время как другой NSDate в разных часовых поясах

Friday, July 8, 2016 at 6:30:00 PM India Standard Time 

Я хочу время даты, как это:

Friday, July 8, 2016 at 6:30:00 PM Central Daylight Time 

Я не хочу, чтобы преобразовать даты, используя NSDateFormatter из одного часового пояса в другой, потому что это преобразование даст мне

Friday, July 8, 2016 at 8:00:00 AM Central Daylight Time 

Я хочу, чтобы один и тот же д ели время, но в другой часовой пояс. Как я могу это сделать?

+2

«Я хочу то же время, что и в другой часовой пояс» Нет, нет. Это два раза - разные даты. – matt

+0

@matt Да демонстративно они оба разные даты, но как я могу создать новую или другую дату, выглядящую так же, как date1, но другой часовой пояс –

ответ

1

Ответ 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 имеет соответствующий календарь, поэтому он способен создать саму дату, тоже. Я думал, это будет немного яснее.

1

Вы можете сделать это путем разделения даты на компоненты в оригинальной временной зоне, установив часовой пояс целевого ваших компонентов и получения результирующей даты (не будет то же дата/время)

import Foundation 

let calendar = NSCalendar.currentCalendar() 
let date = NSDate() 
let origTz = NSTimeZone(abbreviation: "IST")! 
let destTz = NSTimeZone(abbreviation: "CDT")! 
let components = calendar.componentsInTimeZone(origTz, fromDate: date) 
components.timeZone = destTz 
let res = components.date! 
let fmt = NSDateFormatter() 
fmt.timeZone = destTz 
fmt.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
fmt.dateStyle = .FullStyle 
fmt.timeStyle = .FullStyle 
fmt.timeZone = origTz 
print(fmt.stringFromDate(date)) // Sunday, July 10, 2016 at 2:14:21 AM India Standard Time 
fmt.timeZone = destTz 
print(fmt.stringFromDate(res)) // Sunday, July 10, 2016 at 2:14:21 AM Central Daylight Time 
+0

Да вызывающе они оба разные даты. –

+0

myLocalNotification.firedate возвращает простую дату, когда она не содержит информацию о часовом поясе, как я могу использовать ваш код. –

+0

его не работает Я получаю этот результат 2016, 09 июля, суббота, 03:20 –

Смежные вопросы