现在我正在开发一个rails项目。 我的数据库是MySQL。
我查看MySQL的时区:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
SYSTEM
时区是:
mysql> SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`;
+----------+
| timezone |
+----------+
| 9 |
+----------+
另外,我的linux系统的时区是:
$ date +'%:z %Z'
+09:00 JST
现在,当我将记录插入数据库时,created_at值将是utc time。例如:
# Now is 14:25:59
Product.create(name: 'Best')
# select created_at from products;
# 5:25:59
因此,如果我在我的规范源代码中使用rspec测试该功能,我应该从数据库中获取该数据并加上9以等于当前系统时间。好吗?
为什么使用active_record将数据保存为utc时间?如果使用此配置,有没有办法以正确的方式测试数据库记录?
答案 0 :(得分:1)
(也许)最好的方法是在UTC时间保存全部。那么你可以使用Time.in_time_zone来获取指定区域内的时间。
我的20:00 PM是UTC 13:00,也许是你的06:00 AM - 但在数据库中它只是同一时间 - UTC。
如果然后是Rendering,则使用rails helper进行计时,并始终给出created_at.in_time_zone
。
如果要渲染你只是抛出UTC时间戳并让JavaScript到其余时间,请将时间戳格式化为用户本地时间。