如何测试不同时区的数据库记录?

时间:2015-09-09 05:32:33

标签: mysql ruby-on-rails linux testing rspec

现在我正在开发一个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时间?如果使用此配置,有没有办法以正确的方式测试数据库记录?

1 个答案:

答案 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到其余时间,请将时间戳格式化为用户本地时间。