首页 文章

根据用户的时区计算日期和时间[重复]

提问于
浏览
-1

这个问题在这里已有答案:

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

    你没有"convert"到时区的 NSDate . 您只需使用 NSDateFormatter 在用户的时区中创建 NSDate 的字符串表示形式 . NSDateFormattertimeZone 默认为用户's own timezone, so no adjustments are necessary when displaying it in the user'的本地时区 . 例如:

    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时区,则会导致:

    “2016年5月17日下午5:03:34 PDT”

    显然,更改 dateStyletimeStyle 以格式化它,但最适合您的用户界面 . 但是根本不要对 NSDate 对象进行任何调整,而只是在用户自己的时区中构建一个字符串表示 .

相关问题