ActiveRecord数据库中的Ruby日期时间格式

时间:2018-01-02 04:10:43

标签: ruby activerecord

我需要以这种格式保存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: enter image description here

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"

这里发生了什么?我在这里错过了什么吗?数据库中是否有不正确的数据类型字段?

3 个答案:

答案 0 :(得分:2)

ActiveRecord将列强制转换为DateTime对象,由ActiveSupport扩展(烘焙到Rails中)

您要找的是strftimeto_formatted_s(别名为to_s。)

请参阅此处http://api.rubyonrails.org/v5.1/classes/DateTime.html#method-i-to_formatted_shttp://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')