使用Rails和Postgres时日期格式的数字

时间:2018-08-30 01:40:58

标签: ruby-on-rails ruby postgresql

我有一个使用Postgresql的Rails应用。

请从Rails控制台中检出以下命令及其输出:

[11] pry(main)> User.last.created_at_before_type_cast
  User Load (0.6ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> "2018-08-29 11:10:46.526069"

数字526069代表什么以及如何生成?

2 个答案:

答案 0 :(得分:4)

Postgres存储带有时区internally using UTC的时间戳,但是在显示ActiveRecord之前,它将序列化/类型转换到应用程序的时区。

pry(main)>d = DateTime.now.in_time_zone("Asia/Kolkata") => Sat, 07 Oct 2017 00:38:26 IST +05:30 pry(main)> Booking.where('created_at > ?', d).count (1.4ms) SELECT COUNT(*) FROM "bookings" WHERE (created_at > '2017-10-06 19:08:40.011480')

如您所见,d已转换为UTC以在postgres数据库中执行搜索。
created_at_before_type_cast方法将根据您的ActiveRecord配置返回created_at的值,确切地将其存储在数据库中的方式,而无需进行序列化/类型转换。

正如bkimble所指出的:末尾的数字是毫秒。

您应该查看以下内容以加深了解:

答案 1 :(得分:2)

代表微秒。参见https://ruby-doc.org/core-2.2.2/Time.html。默认情况下,所有时间均为微秒。通过强制铸造Time.now来自己检查浮动:

Time.now.to_f
= > 1535595572.4089978

如果要丢掉微秒,请将其强制转换为int:

Time.now.to_i
=> 1535595649

我会想象像“ created_at_before_type_cast”之类的字段表示将其强制转换为整数之前的时间。