在Spring JDBC Template中插入或更新带时间戳的行时,如何指定时区?

时间:2018-03-27 07:46:54

标签: spring-jdbc jdbctemplate

在JDBC API中,我可以使用以下

简单地设置UTC时区

用于插入或更新

PreparedStatement myPreparedStatement = ...
myPreparedStatement.setTimestamp( 1, myDateTime, Calendar.getInstance( TimeZone.getTimeZone( "UTC" ) ));

查询

ResultSet rs = ...
rs.next();
rs.getTimestamp( 1,  Calendar.getInstance( TimeZone.getTimeZone( "UTC" ) ) )

使用Spring JDBC Template ,我需要使用类似的东西进行查询。

对于查询,我没有任何问题,因为可以通过RowMapper访问ResultSet并使用ResultSet以UTC格式传递Calendar实例。但是,对于插入或更新,我只有以下内容。

NamedParameterJdbcTemplate namedParameterJdbcTemplate = ....
SqlParameterSource parameters = new MapSqlParameterSource().addValue("current_timestamp", myDateTime )
namedParameterJdbcTemplate.update(sql, parameters);

问题

有没有办法告诉Spring JDBC模板使用我指定的TimeZone?

我不想使用TimeZone.setDefault(..),因为这会影响我们的旧模块。

2 个答案:

答案 0 :(得分:0)

设置或存储日期对象时不使用时区。你也不应该。这就是Date对象没有时区的原因。日期只是时间线上的一个点。

时区偏移量由客户端或消费应用程序设置,因此它可以使用正确的偏移量来确定其位置/要求。如果您在日期值中创建了一个偏移量,那么下游消耗该数据的所有内容将始终必须知道该日期已关闭,并且必须手动对其进行说明。随着时间的推移,这会成为巨大的痛苦。

答案 1 :(得分:0)

您可以使用JdbcTemplatePreparedStatementCreator作为参数并设置这些对象的字段元信息的任何PreparedStatementSetter方法。