У меня есть требование, в котором у меня есть локальная БД, полная дат из определенного часового пояса, и я хочу преобразовать эту дату из этого конкретного часового пояса в локальный часовой пояс пользователя. Как я уже реализован в том, что первый я всегда преобразование даты БД в формат 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
}
Заранее спасибо. Приветствия!
Возможно, вы можете сделать это гораздо проще с помощью NSDateFormatter. Как выглядит 'startTime'? Какова временная зона хранимых дат? – Paulw11
Поиск переполнения стека для «конвертировать nsdate в местный часовой пояс», и вы получите много и много хитов. – Rob