我想获得一个以时区GMT + 1表示的日期,并以当地时区GMT + 10显示在屏幕上。
我有2个方法,一个用于从String创建日期(使用GMT + 1个timeZone),另一个是将日期格式化为String(使用localTimeZone GMT + 10):
func dateFromString(dateString: String) -> NSDate? {
let dateFormatter = NSDateFormatter()
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT+1")
dateFormatter.dateFormat = "M/d/yyyy hh:mma"
return dateFormatter.dateFromString(dateString)
}
func stringFromDate(date: NSDate) -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.timeZone = NSTimeZone.localTimeZone()
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
return dateFormatter.stringFromDate(date)
}
在操场上,当我这样做时:
let date = dateFromString("4/8/2015 1:29am")!
println(date)
println(stringFromDate(date))
我在右侧获得以下输出:
"Apr 8, 2015, 1:29 AM"
"2015-04-07 15:29:00 +0000"
"1:29 AM"
我不明白为什么我没有得到我期待和寻找的东西:
"Apr 8, 2015, 1:29 AM"
"2015-04-08 10:29:00 +0000"
"10:29 AM"
出了什么问题?
答案 0 :(得分:2)
输入格式化程序需要字符串中的时区。像这样:
func dateFromString(dateString: String) -> NSDate? {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "M/d/yyyy hh:mma z"
return dateFormatter.dateFromString(dateString)
}
let date = dateFromString("4/8/2015 1:29am GMT+01")!
另请注意,NSTimeZone名称具有两位数的偏移量。比较在操场上
var oops = NSTimeZone(abbreviation: "GMT+1")
var righteous = NSTimeZone(abbreviation: "GMT+01")
第一个是零,第二个不是。
答案 1 :(得分:0)
我不相信调试器打印的时间戳的格式。根据我的经验,无论您根据日志设置的时区,日期始终都是UTC。尝试将日期作为字符串添加到项目的标签上,看看它是否正确。
据我所知,背后的原因是当你打印到日志时,它所做的就是调用-description。在NSDate的情况下,这将按照定义返回UTC。