当列的类型为datetime时,如何在窗体上显示本地时间以UTC保存在数据库中



我有一个名为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,为什么它颠倒了顺序?

几个小时后,我在谷歌和stackoverflow上搜索,我想我找到了我想要的。我研究了这个问题,发现了一些关于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")来显示我想要的日期时间格式。

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

Time.zone.now

它考虑了Rails中的配置,与不同

Time.now 

相关内容

  • 没有找到相关文章

最新更新