Adding Time Offset in Swift

二次信任 提交于 2020-04-05 11:58:53

问题


I have a bunch of different show times in a database and want to display the correct time based on the users time zone by creating an offset.

I'm getting the users time zone offset from GMT and converting that to hours first.

NSTimeZone.localTimeZone().secondsFromGMT / 60 / 60

Then I need to find a way to add the hours to the date object.. that is where I/m struggling.

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

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

Then I'm creating a string from the date to use in a label, to have it easy to read with the AM / PM.

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

I just can't seem to find out how to add/subtract hours. I've split the string up but it sometimes goes negative and won't work. Maybe I'm going about this wrong.

Thanks for any help.

Keith


回答1:


If you want to convert a show time which is stored as a string in GMT, and you want to show it in the user's local time zone, you should not be manually adjusting the NSDate/Date objects. You should be simply using the appropriate time zones with the formatter. For example, in Swift 3:

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)

Or in Swift 2:

let formatter = NSDateFormatter()
formatter.dateFormat = "h:mm a"
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)  // original string in GMT
let date = formatter.dateFromString(gmtTimeString)

formatter.timeZone = NSTimeZone.localTimeZone()        // go back to user's timezone
let localTimeString = formatter.stringFromDate(date!)



回答2:


I would use the dateByAddingTimeInterval function to add and subtract hours. Add a to the dateFormat string to print am or 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)



回答3:


Here is my final code, combined with b.Morgans answer. I believe it's all working now.

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!)


来源:https://stackoverflow.com/questions/27612785/adding-time-offset-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!