我需要以这种格式保存datetime属性:YYYY-MM-DD HH:SS。我在数据库中有一个datetime字段:
schema.rb:
create_table "stats", force: :cascade do |t|
...
t.datetime "check_time"
end
参数中的数据如下所示:
{"check_time"=>"2018-01-02 04:57"}
然而它在数据库中保存为2018-01-02 04:43:00 UTC:
Stat.last.check_time #=> check_time: "2018-01-02 04:43:00"
(所以结尾有几秒钟)
然后在我的"/status"
端点中,我将统计信息返回为JSON:
get '/status' do
{ stats: Stat.last }.to_json
end
然后和check_time看起来像这样:
"check_time":"2018-01-02T04:43:00.000Z"
这里发生了什么?我在这里错过了什么吗?数据库中是否有不正确的数据类型字段?
答案 0 :(得分:2)
ActiveRecord将列强制转换为DateTime对象,由ActiveSupport扩展(烘焙到Rails中)
您要找的是strftime
或to_formatted_s
(别名为to_s
。)
请参阅此处http://api.rubyonrails.org/v5.1/classes/DateTime.html#method-i-to_formatted_s和http://foragoodstrftime.com
没有必要弄乱ActiveRecord编写器方法,除非你真的知道自己在做什么,否则不应该这样做。您不需要以特定格式将其保存到数据库中 - 这是一种非标准格式 - 只需在需要时格式化它并保留数据库的datetime-esque列的所有好处。
答案 1 :(得分:1)
试试这个:
def my_date=(val)
DateTime.strptime(val, '%Y%m%d;%H%M%S').strftime('%m/%d/%Y %H:%M:%S') if val.present?
end
请参阅此处http://api.rubyonrails.org/classes/DateTime.html#method-i-to_formatted_s
或
在你的模型中,创建一个setter方法,其中" check_time"是你的数据库字段。
[sec:csrf disabled="true"][/sec:csrf]
答案 2 :(得分:1)
时间戳(AKA" datetime
")在数据库内的分钟数会有更高的分辨率,因此您无法将2018-01-02 04:57
真正存储为时间戳。
您看到的输出:
2018-01-02T04:43:00.000Z
是时间戳的ISO 8601表示以及所有额外的精度和时区偏移(" Z"表示"零"因为Rails喜欢在数据库中使用UTC )。
能够使用数据库的日期和时间函数来操作值可能在某些时候非常有用,因此时间戳/日期时间是您要在数据库中使用的内容。如果您确实需要YYYY-MM-DD hh:mm
作为输出格式,请使用strftime
调整应用程序末尾的输出格式:
stat.check_time.strftime('%Y-%m-%d %H:%M')