为什么我不能使用 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")

第一个是零,第二个不是。