我有一个字符串,类似于2012-01-01T01:02:03.456
,我正在使用ActiveRecord将其存储在Postgres数据库中的时间戳(TIMESTAMP)字段。
不幸的是,Ruby似乎会截去毫秒部分:
ruby-1.9.3-rc1 :078 > '2012-12-31T01:01:01.232323+3'.to_datetime
=> Mon, 31 Dec 2012 01:01:01 +0300
PostgreSQL支持微秒级别的精度。我该如何使我的时间戳相应地保存?我至少需要毫秒级别的精度。
(PS 是的,我可以在PostgreSQL中添加一个毫秒级整数列;但这样做有点违背了ActiveRecord的初衷。)
更新:
非常有帮助的答复表明Ruby的 DateTime
并没有砍掉毫秒级别的精度。使用 #to_f
可以看到。 但是,执行以下操作:
m.happened_at = '2012-01-01T00:00:00.32323'.to_datetime
m.save!
m.reload
m.happened_at.to_f
去掉毫秒。
有趣的是,created_at
时间戳在 Rails 和 Postgres 中都会显示毫秒。但是其他时间戳字段(如上面的 happened_at
)不会显示毫秒。(也许 Rails 在 created_at
上使用了 NOW()
函数而不是传入 DateTime)。
这引出了我的最终问题:
我如何让 ActiveRecord 保留时间戳字段的毫秒分辨率?
created_at
,因为这是我手边有的。你在哪里失去了精度?是在进入数据库之前?还是在数据库中?还是在取出之后? - mu is too shortDateTime
或ActiveSupport::TimeWithZone
,而不是让AR来处理,会发生什么? - mu is too short%z
来指定时区。代码应该像这样:.strftime('%Y-%m-%d %H:%M:%S.%N %z')
。 - Fabiantimestamp
(而不是timestamp with time zone
),时区将是UTC。 - mu is too short