根据用户的时区计算日期和时间

时间:2016-05-17 20:28:19

标签: ios swift nsdate

我要求我有一个本地数据库,其中包含来自特定时区的日期,我想将此日期从该特定时区转换为用户的本地时区。我实现的方式是,首先我总是通过添加小时差异将数据库日期转换为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 个答案:

答案 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个对象进行任何调整,而只是在用户自己的时区中构建一个字符串表示。