答案 0 :(得分:103)
答案 1 :(得分:8)
答案 2 :(得分:4)
BalusC对该问题进行了很好的描述,但缺乏一个好的端到端代码,用户可以自己选择并测试它。
最佳做法是始终将日期时间以UTC时区存储在DB中。 Sql时间戳类型没有时区信息。
将日期时间值写入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时,
然后,将其更改为您想要的时区。我在这里改变它 多伦多时区。
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"));