为什么我不能使用 NSDateFormatter 将我的 NSDate 格式化为指定的时区?
Why can I not format my NSDate with the specified time zone with NSDateFormatter?
我想获取一个以字符串形式表示且时区为 GMT+1 的日期,并将其显示在本地时区为 GMT+10 的屏幕上。
我有两种方法,一种是从字符串创建日期(使用 GMT+1 timeZone),另一种是将日期格式化为字符串(使用 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"
怎么了?
我不相信调试器打印的时间戳格式。根据我的经验,无论您根据日志设置的时区如何,日期始终采用 UTC。尝试将日期作为字符串添加到项目的标签中,看看是否正确。
据我所知,这背后的原因是,当您打印到日志时,它所做的只是调用 -description。在 NSDate 的情况下,根据定义,这将 return 在 UTC 中。
输入格式化程序需要在其字符串中包含时区。像这样:
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")
第一个是零,第二个不是。
我想获取一个以字符串形式表示且时区为 GMT+1 的日期,并将其显示在本地时区为 GMT+10 的屏幕上。
我有两种方法,一种是从字符串创建日期(使用 GMT+1 timeZone),另一种是将日期格式化为字符串(使用 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"
怎么了?
我不相信调试器打印的时间戳格式。根据我的经验,无论您根据日志设置的时区如何,日期始终采用 UTC。尝试将日期作为字符串添加到项目的标签中,看看是否正确。
据我所知,这背后的原因是,当您打印到日志时,它所做的只是调用 -description。在 NSDate 的情况下,根据定义,这将 return 在 UTC 中。
输入格式化程序需要在其字符串中包含时区。像这样:
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")
第一个是零,第二个不是。