这个问题在这里已有答案:
我有一个要求,我有一个本地数据库,其中包含来自特定时区的日期,我想将此日期从该特定时区转换为用户的本地时区 . 我实现的方式是首先我总是通过添加小时差异将数据库日期转换为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
}
提前致谢 . 干杯!
1 回答
你没有"convert"到时区的
NSDate
. 您只需使用NSDateFormatter
在用户的时区中创建NSDate
的字符串表示形式 .NSDateFormatter
的timeZone
默认为用户's own timezone, so no adjustments are necessary when displaying it in the user'的本地时区 . 例如:例如,如果用户处于GMT / UTC-7时区,则会导致:
显然,更改
dateStyle
和timeStyle
以格式化它,但最适合您的用户界面 . 但是根本不要对NSDate
对象进行任何调整,而只是在用户自己的时区中构建一个字符串表示 .