为什么我不能使用NSDateFormatter使用指定的时区格式化我的NSDate?

时间:2015-04-08 00:49:50

标签: ios swift nsdateformatter

我想获得一个以时区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"

出了什么问题?

2 个答案:

答案 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。