我有一个使用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代表什么以及如何生成?
答案 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”之类的字段表示将其强制转换为整数之前的时间。