【发布时间】:2014-04-24 23:02:59
【问题描述】:
我有一个事件模型,它具有开始和结束日期/时间以及相关的时区。
我需要根据输入的时区将提交的日期时间存储在正确版本的 UTC 中。
例如,如果用户提交 2014-04-24 7PM EST
数据库应该是:
2014-04-24T23:00:00.000Z
不是这个:
2014-04-24T19:00:00.000-07:00
好的,我知道 Rails 以 UTC 存储所有内容,但我需要根据时区存储更新后的 UTC 时间 - 因为我的表单是 3 个字段,x2 日期/时间和 x1 时区
这是我认为可以正常工作的模型验证:
def calc_utc_based_off_timezone
time_zone = self.time_zone
puts "start date before assignment: "
puts self.start_date
self.start_date = self.start_date.in_time_zone(time_zone)
self.end_date = self.end_date.in_time_zone(time_zone)
puts "start date after assignment: "
puts self.start_date
end
在我的表单中输入:
2014-04-24 - 19:00
2014-04-26 - 19:00
估计
输出:
分配前的开始日期:
2014-04-24 19:00:00 UTC
分配后的开始日期:
2014-04-24 19:00:00 UTC
我的期望:
分配前的开始日期:
2014-04-24 19:00:00 UTC
分配后的开始日期:
2014-04-24 23:00:00 UTC
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
您正在尝试转换为区域并返回 UTC?您永远不会从循环转换中获得不同的价值。
in_time_zone不会增加时间或任何东西。似乎在这里您需要使用本地时区从您的时间中提取除时区之外的所有内容,然后转换为 UTC。 -
@aledalgrande 嗯,我想我想错了。很难相信没有人做过这个/或者没有日期函数来处理这个。如果我也做了你所指的提取,你的意思是手动添加或减去时间?
-
要么这样,要么您必须以它已经具有与 UTC 不同的时区的方式生成时间。您当前正在执行此操作:UTC -> 其他 -> UTC。这不会改变最后的时间。你需要做的事情:其他的 -> UTC。
-
@canigetabreak 无需手动计算时区偏移量。只需设置 Time.zone = "EST" 或其他任何内容,rails 就会将输入时间解释为在该时区中。 “更新的 UTC”是什么意思? Rails 应用偏移量并将时间存储在 utc 中,当检索任何 datetime 对象时,rails 会抓取 Time.zone,然后应用它来显示您所在时区的时间,而数据库中的 utc 时间没有改变。
标签: ruby-on-rails ruby datetime ruby-on-rails-4