1

我在“欧洲/伦敦”时区有一个数据库服务器,在“欧洲/布鲁塞尔”有一个 Web 服务器。由于现在是夏季时间,我的应用程序服务器有 2 小时的差异。

我创建了一个测试来重现我的问题:

Query q = JPA.em().createNativeQuery("SELECT UNIX_TIMESTAMP(startDateTime) FROM  `Event`  WHERE  `id` =574");
BigInteger unix = (BigInteger) q.getSingleResult();
System.out.println(unix + "000 UNIX_TIMESTAMP to BigInteger");

Query q2 = JPA.em().createNativeQuery("SELECT startDateTime FROM  `Event`  WHERE  `id` =574");
Timestamp o = (Timestamp) q2.getSingleResult();
System.out.println(o.getTime() + " Timestamp");

startDateTime 列被定义为“日期时间”(但与“时间戳”相同的问题)我得到的输出是这样的:

1340291591000 UNIX_TIMESTAMP to BigInteger
1340284391000 Timestamp

读取 java 日期对象会导致时区偏移,我该如何解决?我希望 jdbc 驱动程序仅在 Date 对象中设置它从服务器获取的“unix 时间”值。

(适当的解决方案应该适用于任何时区组合,不仅适用于 GMT 中的 db)

4

3 回答 3

1

您可以设置 MySQL Timestamp 列类型和:

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.pass}"/>
    <property name="idleConnectionTestPeriodInMinutes" value="60"/>
    <property name="idleMaxAgeInMinutes" value="240"/>
    <property name="maxConnectionsPerPartition" value="30"/>
    <property name="minConnectionsPerPartition" value="10"/>
    <property name="partitionCount" value="3"/>
    <property name="acquireIncrement" value="5"/>
    <property name="statementsCacheSize" value="100"/>
    <property name="initSQL" value="SET time_zone='${database.timezone}'"/>

这是我的bonecp dataSource -> 查看initSQL 这个查询是在每个mysql 连接的init 上执行的。如果您的网络服务器位于欧洲/布鲁塞尔,则将此时区设置为 ${database.timezone} 这对我有用。如果你的 mysql 有空的时区表,你需要从 Linux 语言环境中导入它,例如:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

于 2013-10-31T14:08:47.393 回答
1

JDBC 驱动程序使用运行它的 JVM 中的时区设置。如果您在欧洲/布鲁塞尔运行您的应用程序,它假定该时区。如果您的数据库服务器在另一个时区运行,则使用 Java 进行的计算结果可能与使用 SQL 进行的计算结果不同。

于 2012-06-22T18:12:43.197 回答
0

我能够使用连接字符串参数解决此问题

useJDBCCompliantTimezoneShift=true&useSSPSCompatibleTimezoneShift=true

但我对此不是 100% 满意,因为当数据库不在 UTC/GMT 时区时,它会导致更多麻烦。

于 2012-06-26T14:09:47.170 回答