我有一个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(记录被检索并存储在当地时间),我怎么能摆脱它呢?
答案 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