在Swift中添加时间偏移量

时间:2014-12-23 01:09:53

标签: swift nsdateformatter timezone-offset

我在数据库中有很多不同的显示时间,并希望通过创建偏移量来根据用户时区显示正确的时间。

我从GMT获得用户时区偏移并将其转换为小时数。

NSTimeZone.localTimeZone().secondsFromGMT / 60 / 60

然后我需要找到一种方法来将日期对象添加到日期对象中......这就是我/我挣扎的地方。

let formatter = NSDateFormatter()
    formatter.dateFormat = "HH:mm"

    let date = formatter.dateFromString(timeAsString)
    println("date: \(date!)")

然后我从标签中使用日期创建一个字符串,以便用AM / PM轻松阅读。

    formatter.dateFormat = "H:mm"
    formatter.timeStyle = .ShortStyle
    let formattedDateString = formatter.stringFromDate(date!)
    println("formattedDateString: \(formattedDateString)")

我似乎无法找出如何添加/减去小时数。我把弦分开了,但有时候会变成负面而且不起作用。也许我错了。

感谢您的帮助。

基思

3 个答案:

答案 0 :(得分:19)

如果您要转换以GMT格式存储为字符串的节目时间,并且您希望在用户的本地时区显示它,则应手动调整{{1 } / NSDate个对象。您应该只使用格式化程序的适当时区。例如,在Swift 3中:

Date

或者在Swift 2中:

let gmtTimeString = "5:00 PM"

let formatter = DateFormatter()
formatter.dateFormat = "h:mm a"
formatter.timeZone = TimeZone(secondsFromGMT: 0)            // original string in GMT
guard let date = formatter.date(from: gmtTimeString) else {
    print("can't convert time string")
    return
}

formatter.timeZone = TimeZone.current                       // go back to user's timezone
let localTimeString = formatter.string(from: date)

答案 1 :(得分:5)

我会使用dateByAddingTimeInterval函数来添加和减去小时数。添加到dateFormat字符串以打印am或pm。

var showTimeStr = "00:00 PM" //show time in GMT as String
let formatter = NSDateFormatter()
formatter.dateFormat = "hh:mm a"
let showTime = formatter.dateFromString(showTimeStr)
showTime.dateByAddingTimeInterval(3600) //Add number of hours in seconds, subtract to take away time
showTimeStr = formatter.stringFromDate(showTime)

答案 2 :(得分:1)

这是我的最终代码,结合b.Morgans的回答。我相信现在一切正常。

let offsetTime = NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT)

var showTimeStr = "05:00 PM" //show time in GMT as String
let formatter = NSDateFormatter()
formatter.dateFormat = "h:mm a"
let showTime = formatter.dateFromString(showTimeStr)
let finalTime = showTime?.dateByAddingTimeInterval(offsetTime) //Add number of hours in seconds, subtract to take away time
showTimeStr = formatter.stringFromDate(finalTime!)