【问题标题】:Why can I not format my NSDate with the specified time zone with NSDateFormatter?为什么我不能用 NSDateFormatter 用指定的时区格式化我的 NSDate?
【发布时间】:2015-04-08 00:49:49
【问题描述】:

我想获取一个以字符串表示的日期,其时区为 GMT+1,并以本地时区 GMT+10 显示在屏幕上。

我有两种方法,一种是从字符串创建日期(使用 GMT+1 时区),另一种是将日期格式化为字符串(使用 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"

怎么了?

【问题讨论】:

  • 为什么您认为 1;29 AM GMT+1 会变成 10:29 GMT?
  • 我希望我正在解析的日期以当地时间显示,即多 9 小时。所以我认为这样做的方法是解析日期字符串。当我这样做时,我指定这个日期将是 GMT+1,当我格式化这个日期时,我使用 GMT+10。似乎我在某个地方错了,所以我怎么能从 GMT+1 的日期得到 GMT+10 的日期?
  • 但是上面日期列表中的中间行(大概)是 NSDate 对象的转储。这始终以 UTC 显示。
  • 这实际上是我用dateFromString 解析字符串得到的日期。好的,因为使用 println 时日期以 UTC 显示。但我仍然不明白为什么当我使用 println(stringFromDate(date)) 时,我得到“1:29 AM”而不是“10:29 AM”,因为我在 stringFromDate 方法中指定时区为 GMT+10。
  • 好吧,您并没有向我们展示所有代码,以及用于打印输入、中间步骤和输出的日志语句,所以我们真的不能说。例如,“Apr 8, 2015, 1:29 AM”来自哪里——它与其他所有内容不一致。

标签: ios swift nsdateformatter


【解决方案1】:

输入格式化程序需要其字符串中的时区。像这样:

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")

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

【讨论】:

  • 谢谢! GMT+1 是错误的。 GMT+01 确实修复了它。
【解决方案2】:

我不相信调试器打印的时间戳格式。根据我的经验,无论您根据日志设置的时区如何,日期始终采用 UTC。尝试将日期作为字符串添加到项目的标签中,看看是否正确。

据我所知,这背后的原因是,当您打印到日志时,它所做的只是调用 -description。在 NSDate 的情况下,这将根据定义返回 UTC。

【讨论】:

  • 实际上,当我在我的项目中执行此操作时(不是在标签上,而是使用 UIAlertView),它是一样的。当我使用println(stringFromDate(date)) 时,我只是打印出一个字符串,而不是日期。
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多