【问题标题】:How to display local time on form when column has type datetime is saved in database in UTC当列类型为 datetime 时如何在表单上显示本地时间以 UTC 格式保存在数据库中
【发布时间】:2026-02-07 20:40:02
【问题描述】:

我有一个名为 test_date 的列,在 General Exam 表中输入 datetime。我构建了一个表单来创建和更新 GeneralExam,在表单上,​​我允许用户通过jQuery UI Datepicker 选择日期和时间。

用户选择日期和时间后,它将显示在文本字段中,如:

25-11-2012 16:30

这是我现在的时间。当我在控制台中运行时,我看到test_date 保存在数据库中是:

2012-11-25 09:30:00

当我得到对象 GeneralExam 并得到 test_date 值时,它是:

g = GeneralExam.last
g.test_date
=> Sun, 25 Nov 2012 16:30:00 ICT +07:00

我认为test_date是转换的,因为我在application.rb中设置的是:

config.time_zone = 'Hanoi'

但是当我更新表单上的一般考试时,它仍然显示保存在数据库中的时间,而不是我的本地时区,这意味着它显示:

2012-11-25 09:30:00

但我希望它就像我在表单上选择的那样:

25-11-2012 16:30:00

如何设置以当地时间显示日期时间列?

而且我认为日期顺序颠倒了,当我选择日期时,它是25-11-2012,但是当它显示时它是2012-11-25,为什么它颠倒了顺序?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    几个小时后,我在 google 和 * 上搜索,我想我找到了我想要的。我查看了this question 并找到了一些关于strftime 方法的信息。这是我解决问题所需的信息。

    首先,如何显示日期时间在显示时以UTC保存为本地时间:

    Value was saved:                             2012-11-25 09:30:00
    
    Value I want display on form (ICT +7:00):    25-11-2012 16:30:00
    

    为了显示我想要的值,我在表单上使用了这个(我使用了 simple_form):

    <%= f.input :test_date, as: :string, label: false, input_html: { id: "datetime_picker", value: f.object.test_date.strftime("%d-%m-%Y, %H:%M") } %> 
    

    我在数据库中获得了价值并通过以下方式对其进行格式化:

    value: f.object.test_date.strftime("%d-%m-%Y, %H:%M") } %> 
    

    当我想在表格数据中显示test_date时,我还使用strftime("%d-%m-%Y, %H:%M")来显示我想要的日期时间格式。

    【讨论】:

    • value: f.object.test_date.localtime 更短
    【解决方案2】:

    正确的设置与您的 Rails 配置有关,也与您的数据库配置有关。有一个Railscast,解释了如何避免大多数陷阱。为了保持一致性,所有日期和时间都以 UTC 格式保存在数据库中。转换由 Rails config 进行,具体取决于您的 config.time_zone 。在这种情况下,您应该尝试:

    Time.zone.now
    

    考虑到Rails中的配置,不同于:

    Time.now 
    

    【讨论】:

    • 我不想获取当前时间,但我想在本地显示保存在数据库中的时间。转了一圈后,我找到了解决方案,我将其发布为答案:)
    最近更新 更多