【问题标题】:Time.zone.parse not converting correctlyTime.zone.parse 未正确转换
【发布时间】:2013-01-14 00:38:13
【问题描述】:

在我的开发中:

str = "Sat Jan 12 2013 14:00:00 GMT-0500"
Time.zone.parse(str).utc

输出:

2013-01-12 19:00:00 UTC

在我的制作中(appfog):

2013-01-12 14:00:00 UTC

如何让它不忽略时区?

【问题讨论】:

  • 输出不正确吗?它和 prod 输出有什么区别?是第一次输出开发吗?
  • @AndrewMarshall,生产系统忽略了字符串已经包含 TZ 信息。

标签: ruby-on-rails ruby datetime timezone


【解决方案1】:

Time.zone.parse 将传递的时间解释为当前系统时区,丢弃字符串中的时区信息:

require 'active_support/all'

`date '+%Z %z'`.strip
#=> "EST -0500"
Time.zone = 'MST'
Time.zone.parse('Fri, 31 Dec 1999 14:00:00 HST -10:00')
#=> Fri, 31 Dec 1999 12:00:00 MST -07:00

请注意,正如预期的那样,解析的时间以 MST 为单位,但它已将其调整为两个小时前 - 这是 EST(系统时区)和 MST(ActiveSupport 的Time.zone)之间的偏移量。不过,这可能是一个错误,因为删除时区“名称”可以按预期工作:

Time.zone.parse('Fri, 31 Dec 1999 14:00:00 -10:00')
#=> Fri, 31 Dec 1999 17:00:00 MST -07:00

由于您最终只是转换为 UTC,您可能只想使用DateTime.parse

DateTime.parse('Fri, 31 Dec 1999 14:00:00 HST -10:00').utc
#=> Sat, 01 Jan 2000 00:00:00 +0000

【讨论】:

  • 万岁,它有效!仅供参考,在 Mongoid 中也确实存在一个错误,其中 Javascript 字符串日期的时间戳被忽略了!我必须在控制器中手动将其设置为 DateTime.parse 以覆盖传入的 javascript 日期。
  • @K2xL 你应该报告这个问题,然后在这里发布链接:)
【解决方案2】:

去掉“GMT”位——它可能会混淆解析器:

str = "Sat Jan 12 2013 14:00:00 -0500"
Time.zone.parse(str).utc

【讨论】:

  • 开发模式下怎么不混淆解析器?
  • 我猜你的开发机器与生产的时间线设置不同。即设置为使用您的本地时区而不是UTC,反之亦然
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2013-03-29
  • 2020-06-21
  • 2014-08-13
  • 2017-01-07
相关资源
最近更新 更多