【问题标题】:Converting time & timezone into UTC将时间和时区转换为 UTC
【发布时间】:2016-07-06 02:39:41
【问题描述】:

我觉得以前有人问过这个问题,但到目前为止没有一个解决方案对我有用。

由于使用 Heroku,我也被绑定到 Postgres(目前)

我正在存储一个包含时间和时区的预订。

然后我需要将该时间转换为 UTC,以便我可以在适当的时间使用它执行功能

所以我有@booking.arrival_date@booking.time_zone

到目前为止,我的解决方案是:

Time.zone = @booking.time_zone

  arrival_date = Time.zone.parse @booking.arrival_date.to_s
  @booking.arrival_date = arrival_date.utc

  @booking.save

但这不起作用。编辑:当前值停留在用户选择的时间(而不是转换为 UTC)

任何帮助将不胜感激:)

【问题讨论】:

  • “这不起作用”并没有告诉我们任何关于实际发生的事情。你的输入是什么?预期的输出是多少?实际输出是多少?您还应该考虑一些棘手的问题,例如本地时间不明确或由于夏令时转换而被跳过。
  • 嘿,我添加了编辑以显示当前正在发生的事情。另外,我有大约 6 个小时的时间可以玩,所以我可以在以后担心夏令时和其他事情(如果有的话)
  • 我们仍然不知道Time.zone 的值是什么,或者基本上是任何样本。如果您可以生成一个简短但完整的 Ruby 脚本来显示问题 - 不涉及任何其他内容 - 这将更容易为您提供帮助。

标签: postgresql ruby-on-rails-4 timezone


【解决方案1】:

我认为您根本不需要编写任何代码。在config/application.rb 中查找您设置的应用程序时区。默认为 UTC,您应该保持这种状态。还要查找 Postgres 默认时区。如果你在 Heroku 上,那也应该是 UTC。

由于这是 Rails,您的列很可能是 TIMESTAMP WITHOUT TIME ZONE。然后在内部,您的所有时间都将自动存储在 UTC 中。因此,如果您想对它们进行计算,请继续。

这绝对是糟糕的:Time.zone = @booking.time_zoneTime.zone 值是一个全局变量,是 Rails 配置的一部分。通过设置它,您使您的代码线程不安全(这可能无关紧要)并让一个请求污染另一个请求(这可能会)。如果你需要把它放在某个地方,就说tz = @booking.time_zone

现在您可能 需要做的是解析用户提交的时间字符串,将其解释为来自给定的时区。这就是你要在你的控制器中处理的事情:

h = booking_params
tz = ActiveSupport::TimeZone[h[:time_zone]]
h[:arrival_date] = tz.parse h[:arrival_date]
@booking = Booking.new(h)

当然你应该添加一些缺失值的检查,适应你自己的代码,等等。

这是一个article on time zones in Rails(我写的),可以帮助您更清楚地思考这个问题。

【讨论】:

  • 谢谢!我的做法是错误的,现在这是有道理的。另外,我在问这个问题之前阅读了你的博客文章。但在我的挫折中(来自这个问题)我没有接受它。
猜你喜欢
  • 2013-06-30
  • 2014-10-05
  • 2019-05-31
  • 1970-01-01
  • 2023-04-04
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多