我们在AWS RDS实例上使用最新的MySQL服务器,并且我们已将其配置为在美国东部数据中心运行它。我们假设任何新的Date()或Time.now()调用都会将日期存储在运行数据库服务器的时区中。
有没有办法让我在美国东部运行的AWS RDS实例指向PST时区,因此任何持久的日期都会将值存储在PST而不是EST中。 (即如果在美国东部时间上午10点左右存储一个物体,则db列应该反映在美国东部时间上午7点。)
答案 0 :(得分:34)
在我的回答之前,我现在只想建议,如果您有任何选择更改您的应用程序以使用UTC,它将为您现在和将来节省很多悲伤。
但是考虑到你的问题的背景,我假设这不是一个选项,并且你正在调整一个设计用于在传统服务器环境中使用MySQL的系统,你可以在那里改变时区,并且代码逻辑需要这个时区,并且不能轻易地适应使用UTC。
但如果您确实需要将其存储为PST,请继续阅读。
默认情况下,mySql将使用服务器的时区进行时间戳存储,这是正确的,但您认为RDS实例根据启动它们的AWS区域设置的时区不正确 - 启动所有RDS实例,并将其时区设置为UTC and this configuration can't be changed:
时区目前无法修改。的确有一个 调用
rds-describe-db-parameters
中的参数值 “default_time_zone”但它被标记为不可修改。
因此,您唯一的选择是将应用程序对数据库实例的每个连接设置为PST。您可以按照found here这两个步骤使用SET SESSION time_zone = 'PST'
查询在应用程序的每个连接中执行:
创建以下存储过程(UTC-8为PST):
DELIMITER | CREATE PROCEDURE mysql.store_time_zone () IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN SET SESSION time_zone = '-8:00'; END IF | DELIMITER ;
连接到您的实例,然后运行以下命令:
$ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate"
您可能需要向将要连接到数据库的用户授予EXECUTE
权限,否则您可能会收到连接错误:
GRANT EXECUTE ON PROCEDURE mysql.store_time_zone TO 'user'@'host';
现在,任何客户端针对您的RDS实例执行的每个查询都应该使用PST,而无需修改任何应用程序逻辑,也无需更新数据库中以前存储的任何时间戳。