【问题标题】:Convert Ruby on Rails 5 datetime into milliseconds respecting the timezone将 Ruby on Rails 5 日期时间转换为尊重时区的毫秒数
【发布时间】:2019-09-09 03:25:16
【问题描述】:

我正在尝试将 Rails 日期时间转换为毫秒,但当我调用 .strftime.to_i 时,它会忽略分配给它的时区并读取系统的时区

system timezone: Europe/London # currently is +01:00 due to BST
# application.rb
config.time_zone = 'Europe/Athens' # +03:00
stored in database as GMT: 2019-04-19 10:00:00.000000

start_date: schedule.start_date,
to_datetime: schedule.start_date.to_datetime,
strftime: schedule.start_date.to_datetime.strftime('%Q').to_i,
start_date: "2019-04-19T13:00:00.000+03:00",
to_datetime: "2019-04-19T13:00:00.000+03:00",
strftime: 1555668000000, # 2019-04-19T11:00:00.000+01:00

它在视图中正确呈现

<%= schedule.start_date %>
# 13:00:00 19 Apr 2019
irb(main):004:0> Time.at(1555668000)
=> 2019-04-19 11:00:00 +0100

如果之前已经回答过这个问题,我深表歉意,但我找不到令人满意的解决方案。

【问题讨论】:

  • 为什么你认为1555668000 等于2019-04-19T13:00:00.000+01:00?你错了。 1555668000 等于 GMT: 2019-04-19 10:00 在您的情况下是正确和预期的。
  • 时间戳的定义是自协调世界时 (UTC) 1970 年 1 月 1 日星期四 00:00:00 以来经过的秒数。
  • 您可以使用 Ruby 方法Time.at(1555668000) 或通过关键字convert unix to utc 在互联网上找到的任何在线服务来确保您得到的结果是正确的
  • 我想将日期时间转换为毫秒加上时区偏移量
  • 根据1555668000,如果我使用Time.at(1555668000),我会得到2019-04-19 17:00:00 +0700,这是我当地时区(曼谷)的时间,这就是为什么你会得到2019-04-19 11:00:00 +0100的原因当地时区。如果您的预期结果是2019-04-19 13:00:00 +0300,您可以使用Time.zone.at(1555668000).to_time

标签: ruby-on-rails ruby datetime timezone


【解决方案1】:

我最终做了这样的事情

system timezone: UTC
# application.rb
config.time_zone = 'UTC'

然后我实现了一个与此类似的时区切换器 http://railscasts.com/episodes/106-time-zones-revised

dst = Time.zone.now.dst?
offset = Time.zone.utc_offset
offset += 3600 if dst

ts = (schedule.start_date.to_i + offset) * 1000

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    相关资源
    最近更新 更多