我们在 AWS RDS 实例上使用最新的 MySQL 服务器,并且我们已配置为在美国东部数据中心运行它。我们假设任何新的 Date() 或 Time.now() 调用都会将日期存储在数据库服务器运行的时区中。
有没有办法将我在美国东部运行的 AWS RDS 实例指向 PST 时区,以便任何持久性日期都将值存储在 PST 而不是 EST 中。(即如果在美国东部标准时间上午 10 点左右存储一个对象,则 db 列应该反映美国东部标准时间上午 7 点)。
我们在 AWS RDS 实例上使用最新的 MySQL 服务器,并且我们已配置为在美国东部数据中心运行它。我们假设任何新的 Date() 或 Time.now() 调用都会将日期存储在数据库服务器运行的时区中。
有没有办法将我在美国东部运行的 AWS RDS 实例指向 PST 时区,以便任何持久性日期都将值存储在 PST 而不是 EST 中。(即如果在美国东部标准时间上午 10 点左右存储一个对象,则 db 列应该反映美国东部标准时间上午 7 点)。
在我回答其余部分之前,我现在只想建议您,如果您可以选择更改您的应用程序以使用 UTC,它将在现在和将来为您省去很多麻烦。
但是,鉴于您的问题的上下文,我假设这不是一个选项,并且您正在调整一个旨在在传统服务器环境中使用 MySQL 的系统,您可以在其中更改时区,并且有代码逻辑预计这个时区,不能轻易适应使用 UTC。
但是,如果您真的需要将其存储为 PST,请继续阅读。
您是正确的,默认情况下 mySql 将使用服务器的时区进行时间戳存储,但是您假设 RDS 实例根据它们启动的 AWS 区域设置其时区是不正确的- 所有 RDS 实例的时区设置为UTC,并且此配置无法更改:
时区当前不可修改。确实有一个
rds-describe-db-parameters
名为“default_time_zone”的参数值,但它被标记为不可修改。
因此,您唯一的选择是将应用程序与数据库实例建立的每个连接上的时区设置为 PST。您可以按照此处找到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,而无需修改任何应用程序逻辑,也无需更新数据库中任何先前存储的时间戳。