我要求我有一个本地数据库,其中包含来自特定时区的日期,我想将此日期从该特定时区转换为用户的本地时区。我实现的方式是,首先我总是通过添加小时差异将数据库日期转换为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
}
之前我正在使用此功能,但它没有为Day节能国家返回正确的本地日期。
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
}
提前致谢。干杯!
答案 0 :(得分:0)
你没有"转换" NSDate
到时区。您只需使用NSDate
在用户的时区中创建NSDateFormatter
的字符串表示形式。 timeZone
的{{1}}默认为用户自己的时区,因此在用户的本地时区显示时无需进行任何调整。例如:
NSDateFormatter
例如,如果用户处于GMT / UTC-7时区,则会导致:
" 2016年5月17日下午5:03:34 PDT"
显然,更改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)
和dateStyle
以格式化它,但最适合您的用户界面。但是根本不对timeStyle
个对象进行任何调整,而只是在用户自己的时区中构建一个字符串表示。