我最近遇到了一个问题,该问题是将LocalTime
保存到MySQL数据库的TIME
列中。保存值9:00
导致8:00
被保存在数据库中。
这个问题在我的开发环境(Windows)上没有发生,但是在我们尝试过的两台Linux机器上都发生了。
我的代码如下:
preparedStatement.setObject(parameterIndex, localTime, JDBCType.TIME);
经过调查,我最终发现MySQL JDBC驱动程序正在使用java.sql.Time.valueOf(localTime)
,然后使用时区设置为MySql服务器的SimpleDateFormat
系统属性的system_time_zone
(通过{{ 1}}),以将其打印为字符串。
在Linux机器上,time_zone = 'SYSTEM'
是system_time_zone
,在Windows机器上是GMT
。 (我在英国。)
因此,将GMT Standard Time
LocalTime
转换为9:00
的{{1}}(实际上内部建模为Time
),然后使用9:00 Europe/London
时区,与1st January 1970 9:00 Europe/London
相同。现在,通常这两个时区与1月份的UTC时差为零,但英国在1969年和1970年全年仍处于夏令时。因此减去了一个小时。
将GMT
写入MySQL数据库以避免这种问题的最佳方法是什么?我只想要UTC
,没有时区,没有日期,只有一天中的时间。我不希望它针对时区的差异进行调整,因为它只是LocalTime
,而不是在任何特定的日期或地点。
目前,我只是将9:00
打印为字符串,并将其发送到数据库,但是我觉得应该有更好的方法。有吗?