Rails Time.zone.name与Time.now.getlocal不一样



在rails控制台中,如果我运行以下命令,我得到:

>> Time.zone.name
=> "UTC"
>> Time.now.getlocal
=> 2015-08-06 16:34:57 -0400

我在纽约,utc偏移量是-4小时,所以getlocal似乎得到的是系统时区,而不是环境时区。当使用String to_time方法时,这会成为一个问题:

>> s = "2015-08-06 16:34:57"
=> "2015-08-06 16:34:57"
>> s.to_time(:utc)
=> 2015-08-06 16:34:57 UTC
>> s.to_time(:local)
=> 2015-08-06 16:34:57 -0400
>> s.to_time
=> 2015-08-06 16:34:57 -0400

知道为什么吗?我可以强制它查看环境时区而不是系统时区吗?

我的主要动机是我的测试是在本地运行的(所以系统时间在纽约),但我的应用程序托管在heroku上,它有UTC服务器时间,所以这导致了一个问题,一个bug通过我的测试进入生产=/

您可以这样做:

"2015-08-06 16:23:25".to_time.in_time_zone

to_time的默认行为是根据API文档使用:local (:local:utc都有效)。无论出于何种原因,使用in_time_zone似乎尊重您配置的时区。

扩展你上面发布的例子(来自我的机器):

»  Time.zone.name
=> "UTC"
»  Time.now
=> "2015-08-06T13:49:05.195-07:00"
»  Time.zone.now
=> Thu, 06 Aug 2015 20:49:17 UTC +00:00
»  time_string = "2015-08-06 16:34:57"
=> "2015-08-06 16:34:57"
»  time_string.to_time
=> "2015-08-06T16:34:57.000-07:00"
»  time_string.to_time.in_time_zone
=> Thu, 06 Aug 2015 23:34:57 UTC +00:00

EDIT:根据下面的注释,您还可以执行以下操作来不添加任何时移:

»  DateTime.parse(time_string)
=> Thu, 06 Aug 2015 16:34:57 +0000

这将使用配置的时区(在我的情况下是UTC)

相关内容

  • 没有找到相关文章

最新更新