2016-05-17 5 views
0

У меня есть требование, в котором у меня есть локальная БД, полная дат из определенного часового пояса, и я хочу преобразовать эту дату из этого конкретного часового пояса в локальный часовой пояс пользователя. Как я уже реализован в том, что первый я всегда преобразование даты БД в формат UTC, добавив разницу часов, а затем преобразовать его в пользовательский часовой пояс, принимая интервал времени, используяРасчет даты и времени на основе часового пояса пользователя

NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT 

и добавить его к Дата UTC. Я хотел бы знать, что подход подходит, потому что он работал до сих пор на моем ограниченном тестировании. Также будут учитываться страны, в которых в настоящее время активна дневная светоотдача.

Полный код:

func calculateDate(model:EventModel) -> NSDate 
{ 
    let date = model.Date 
    let startTime = model.StartTime 
    let arrayForTime = startTime?.componentsSeparatedByString(":") 
    let arrayForDates = date?.componentsSeparatedByString("-") 

    let calender = NSCalendar(identifier:NSCalendarIdentifierGregorian) 
    let year = Int(arrayForDates![2]) 
    let month = Int(arrayForDates![1]) 
    let day = Int(arrayForDates![0]) 
    let hour = Int(arrayForTime![0])! + 3 //UTC - 3 the local time 
    let minutes = Int(arrayForTime![1]) 

    let dateComponents = NSDateComponents() 
    dateComponents.day = day! 
    dateComponents.month = month! 
    dateComponents.year = year! 
    dateComponents.hour = hour 
    dateComponents.minute = minutes! 
    dateComponents.second = 0 
    dateComponents.timeZone = NSTimeZone(name: "UTC") 
    let UTCDate = calender?.dateFromComponents(dateComponents) 
    let dateLocal = self.getLocalDate(UTCDate!) 

    return dateLocal 
} 

    func getLocalDate(utcDate:NSDate) -> NSDate 
{ 
    let timeInterval = NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT) 
    let localdate = utcDate.dateByAddingTimeInterval(timeInterval) 
    return localdate 
} 

Раньше я использовал это, но он не возвращает правильную местную дату для Дня стран экономии света.

func getLocalDate(utcDate:NSDate) -> NSDate 
{ 
    let timeInterval = NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT) 
    //  let timeZoneObj = NSTimeZone.localTimeZone() 
    let localdate = utcDate.dateByAddingTimeInterval(timeInterval) 
    //  let isDayLightSavingOn = timeZoneObj.isDaylightSavingTimeForDate(localdate) 
    //  if(isDayLightSavingOn == true) 
    //  { 
    //   let dayLightTimeInterval = timeZoneObj.daylightSavingTimeOffsetForDate(localdate) 
    //   timeInterval -= dayLightTimeInterval 
    //  } 
    //  localdate = utcDate.dateByAddingTimeInterval(timeInterval) 
    return localdate 
} 

Заранее спасибо. Приветствия!

+1

Возможно, вы можете сделать это гораздо проще с помощью NSDateFormatter. Как выглядит 'startTime'? Какова временная зона хранимых дат? – Paulw11

+0

Поиск переполнения стека для «конвертировать nsdate в местный часовой пояс», и вы получите много и много хитов. – Rob

ответ

0

Вы не «конвертируете» NSDate в часовой пояс. Вы просто создаете строковое представление NSDate в часовом поясе пользователя, используя NSDateFormatter. timeZoneNSDateFormatter по умолчанию использует собственный часовой пояс пользователя, поэтому при его отображении в локальном часовом поясе пользователя не требуется никаких корректировок. Например:

let date = ... // let's imagine it was "2016-05-18 00:03:34 +0000" 

let formatter = NSDateFormatter() 
formatter.dateStyle = .LongStyle 
formatter.timeStyle = .LongStyle 
let userDateString = formatter.stringFromDate(date) 

Если пользователь был в GMT/UTC-7 часового пояса, например, что приведет к:

"17 мая 2016 в 5:03:34 PM PDT"

Очевидно, что изменение dateStyle и timeStyle в его формат лучше всего подходит для пользовательского интерфейса. Но не делайте никаких корректировок объектов NSDate, а просто создавайте строковое представление в пользовательском часовом поясе.

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