BalusC对该问题进行了很好的描述,但缺乏一个好的端到端代码,用户可以自己选择并测试它。
最佳做法是始终将日期时间以UTC时区存储在DB中。Sql时间戳类型没有时区信息。
将datetime值写入sql db时//Convert the time into UTC and build Timestamp object.
Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
//use setTimestamp on preparedstatement
preparedStatement.setTimestamp(1, ts);
从DB读取值返回java时,在java.sql.Timestamp类型中读取它。
使用LocalDateTime类中的atZone方法将DateTime值设置为UTC时区中的时间。
然后,将其更改为您想要的时区。我在这里将它改为多伦多时区。ResultSet resultSet = preparedStatement.executeQuery();resultSet.next();Timestamp timestamp = resultSet.getTimestamp(1);ZonedDateTime timeInUTC = timestamp.toLocalDateTime().atZone(ZoneId.of("UTC"));LocalDateTime timeInToronto = LocalDateTime.ofInstant(timeInUTC.toInstant(), ZoneId.of("America/Toronto"));