gpt4 book ai didi

ruby-on-rails - 被 Rails 中的时区困扰

转载 作者:行者123 更新时间:2023-12-04 07:36:52 25 4
gpt4 key购买 nike

我有一个使用以下配置的应用程序:

Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
config.time_zone = 'Amsterdam'
config.active_record.default_timezone = :utc
end

我为用户提供了一个表单,要求提供单独的日期(日期选择器)和时间字段(下拉列表)。在 before 方法中,我将日期和时间连接到一个日期时间字段中。似乎 Time 对象以某种方式使用 UTC,而 Date 对象并不关心这一点。

将其存储到数据库中时,时区以某种方式得到纠正,但时间为 2 小时。这是因为时间仍然是 UTC 吗?我怎样才能以一种同时尊重夏令时的方式弥补这一点?

代码示例

表格:
= simple_form_for @report do |f|
.row
.col.s6
= f.association :report_category
.col.s6
= f.association :account
.row
.col.s6.l4
= f.input :day, as: :string, input_html: {class: 'datepicker current-date'}
.col.s6.l4
= f.input :time, as: :string, input_html: {class: 'timepicker current-date'}

模型中的回调
  def create_timestamp
self.date = day.to_datetime + time.seconds_since_midnight.seconds
end

保存后,我在表格中选择的时间之间有 2 小时的差异。

这是创建新记录后的样子,其中时间与创建记录的时间相同,以查看差异:
 date: Sat, 20 May 2017 16:10:00 CEST +02:00,
created_at: Sat, 20 May 2017 14:10:33 CEST +02:00,
updated_at: Sat, 20 May 2017 14:10:33 CEST +02:00,
deleted_at: nil,
time: 2000-01-01 14:10:00 UTC,
day: Sat, 20 May 2017,

如您所见,时间存储在 UTC 中,而实际上是我创建记录的欧洲中部时间 14:10 +0200。所以这可能会导致差异。您可以在日期中看到,其中的时间与 created_at 相差 2 小时。

谢谢

最佳答案

将所有内容保留在 UTC 中并消除差异。
当表单提交字段并连接 DateTime 对象时,它将被解释为 UTC...因此您必须在提交信息后进行转换。
模型.rb

    # Set the Proper DateTie
def create_timestamp
# Create the DateTime
date = day.to_datetime + time.seconds_since_midnight.seconds
# Set the timezone in which you want to interpret the time
zone = 'Amsterdam'
# Find the offset from UTC taking into account daylight savings
offset = DateTime.now.in_time_zone(zone).utc_offset / 3600
# Back out the difference to find the adjusted UTC time and save it as UTC with the correct time
self.date = date - offset.hours
end

关于ruby-on-rails - 被 Rails 中的时区困扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com