作为Rake任务的一部分,我需要将UTC时间转换为用户时区中的等效时间.我想要做的是更改午夜的UTC时间戳,并将时间戳重新创建为用户所在时区的午夜.

示例

转换UTC时间

Wed, 01 Mar 2017 00:00:00 UTC +00:00

遵守夏令时( spring /夏季)时的东部夏令时(EDT)

Wed, 01 Mar 2017 04:00:00 UTC +00:00
zone = ActiveSupport::TimeZone.new("Eastern Time (US & Canada)")
time = "Wed, 01 Mar 2017 00:00:00 UTC +00:00"
time.in_time_zone(zone)
=> Tue, 28 Feb 2017 19:00:00.000000000 EST -05:00

上面的代码在数据库中仍然会保存为Wed, 01 Mar 2017 00:00:00 UTC +00:00,因为Rails会将所有的时间戳转换回UTC.然而,我需要得到Wed, 01 Mar 2017 04:00:00 UTC +00:00,因为这是true开始的一天在用户的时区.

推荐答案

您可以通过ActiveSupport::TimeZone#parse来解析相对于时区的字符串.只需确保省略任何时区说明符,如"UTC+00:00":

zone = ActiveSupport::TimeZone.new("Eastern Time (US & Canada)")

time = zone.parse("Wed, 01 Mar 2017 00:00:00")
#=> Wed, 01 Mar 2017 00:00:00.000000000 EST -05:00

time.utc
#=> 2017-03-01 05:00:00 UTC

最后一次调用utc只是为了说明目的,在将time保存到数据库时,Rails将自动执行此转换.

使用数字输入:

time = zone.local(2017, 3, 1)
#=> Wed, 01 Mar 2017 00:00:00.000000000 EST -05:00

Ruby-on-rails相关问答推荐

错误:部署到 Heroku 时找不到模块tailwindcss/defaultTheme

NoMethodError:Puma::Events:Class 的未定义方法字符串

Selenium chromedriver:无法从不可键入的键构造KeyEvent

heroku 推送错误:无法检测到 rake 任务

Rails:序列化数据库中的对象?

如何在 Rails 3 中使用 Capybara 单击具有相同文本的第二个链接?

我如何在不同的视图中使用助手

如何获取 Ruby on Rails 生成的表单元素 id 以供 JavaScript 参考?

如何判断是否已经在 ruby​​ on rails 的数据库事务中?

Rails(或 Ruby):Yes/No 而不是 True/False

rails 方法获取模型的关联名称

通过 Ruby 或 Rails 的 LDAP

过滤器在渲染之前但在控制器之后执行?

在 Rails 协会中未找到名为的协会可能拼写错误的问题

Rails:一次添加多个 flash[:notice] 的简单方法

您如何访问设计控制器?

Ruby on Rails 3:通过 Rails 将数据流式传输到客户端

Rails:弃用警告:您没有设置 config.secret_key_base

如何在 Rails 4 中测试控制器关注点

没有UTC的Rails 3默认日期时间格式