编辑表单中的rails datetime字段表示UTC

时间:2014-08-27 22:36:52

标签: mysql ruby-on-rails

我有一个datetime字段,该值存储在mysql中,如下所示:

2014-08-26 16:00:00

当用户选择datetime时,他们会从jquery datetime弹出窗口中选择它。并将其插入文本字段并发送到服务器,此时将对其进行解析:

def date_start=(s)
  datetime = parse_datetime s
  write_attribute :date_start, datetime
end

def parse_datetime(s)
  DateTime.strptime(s,'%m/%d/%Y %I:%M %p')
end

然后插入数据库。现在,当用户编辑表单时,日期时间显示在文本字段中,但显示如下:

2014-08-26 16:00:00 UTC

为什么在那里说UTC(记录被检索并存储在当地时间),我怎么能摆脱它呢?

2 个答案:

答案 0 :(得分:1)

将时间戳存储在数据库中作为UTC时间被认为是一种很好的做法,无论它们最初是哪个时区(因此可以准确地比较它们并防止通常在事情不一致时出现的混乱)。

Active Record通过自动进行转换来解决此问题。这意味着当用户选择日期时间时,您必须确保在输入时使用Time.use_zone()或类似内容在Rails / Ruby中给出正确的时区。同样在从数据库中检索后显示它。您需要某种方法来检索用户的本地时区(Javascript或手动选择的配置文件选项)。

另外,如果要将应用程序的默认时区设置为UTC以外的其他时区,则可以更改config.time_zone中的application.rb选项。请注意,数据库仍将以UTC格式存储内容,它只允许您为日期时间输入和输出设置合理的默认时区(即Active Record转换为/从的默认时区)。但是,除非所有用户都位于同一时区,否则它对单个用户的日期时间没有帮助。

答案 1 :(得分:0)

你根本不应该覆盖作家。 Rails shoudl正确处理它。  在表格中显示日期时间如下:

 f.text_field :date_start, (f.object.date_start.strftime('%m/%d/%Y %I:%M %p') if f.object.date_start ) ...

或制作方法

def form_date_start
  date_start.strftime('%m/%d/%Y %I:%M %p') if date_start
end

并以表格

f.text_field :date_start, f.object.form_date_start
相关问题