2016-03-19 201 views
0

我觉得这个问题之前曾被问过,但迄今为止,这些解决方案都没有为我工作。将时间和时区转换为UTC

由于使用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,而不是)

任何帮助,将不胜感激由用户选择的时间:)

+0

“这不起作用”并没有告诉我们有关实际发生的事情。你的意见是什么?预期产出是多少?实际输出是多少?您还应该考虑一些棘手的问题,例如当本地时间由于夏令时转换而不明确或跳过时。 –

+0

嘿,我已经添加了编辑以显示目前正在发生的事情。另外,我有大约6个小时的时间来玩,所以我可以在以后担心夏令时和其他事情(如果有的话) –

+0

我们仍然不知道'Time.zone'的价值是什么,或者基本上任何样品。如果您可以制作一个简短但完整的Ruby脚本来显示问题 - 而不涉及任何其他问题 - 这可以更容易地帮助您。 –

回答

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(由我)这可能会帮助你更清楚地考虑这一点。

+0

谢谢!我以错误的方式去讨论,现在这是有道理的。另外,我在提问之前先阅读你的博文,但是在我的挫折中(从问题),我没有接受。 –