我在数据库中有很多不同的显示时间,并希望通过创建偏移量来根据用户时区显示正确的时间。
我从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)")
我似乎无法找出如何添加/减去小时数。我把弦分开了,但有时候会变成负面而且不起作用。也许我错了。
感谢您的帮助。
基思
答案 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!)