在Java java.sql.Timestamp中检索Oracle Date / Timestamp字段,而不转换为DST

问题描述 投票:0回答:1

我在oracle中有DATE数据类型的列(LOGIN_TIME)。我正在尝试使用JDBC将其作为Java中的Timestamp读取。我的表中的一行具有此列的值2006-04-02 02:00:01.0。当我做

从TABLE中选择LOGIN_TIME,CAST(LOGIN_TIME作为TIMESTAMP);

我看到sql-developer将值显示为

2006-04-02 02:00:01.0

但是当我使用ResultSet.getTimestamp()方法在Java中检索此列值时,我将值视为2006-04-02 03:00:01.0。

经过大量的谷歌搜索,我明白了

  1. 首先,2006-04-02 02:00:01.0无效/丢失时间为2006-04-02 01:59:00.0因为夏令时点击2006-04-02 03:00:00.0
  2. Oracle Date / Timestamp数据类型不维护时区,因此Oracle在插入数据库时​​接受了此值而没有抱怨。
  3. 但是,由于02:00:01是无效时间,因此默认情况下Java会对其进行宽松处理,并将时间转换为假设的正确时间03:00:01。

现在,我的问题是

  1. 为什么java假设正确的时间为03:00:01?是否依赖于任何时区,如果是,默认时区是什么?我不认为这里的默认时区是UTC,因为

System.out.println(+ rs.getTimestamp(index,Calendar.getInstance(TimeZone.getTimeZone(“UTC”))));

给了我价值

2006-04-01 18:00:01.0

  1. 如何在没有DST转换的情况下从Oracle检索到的值为2006-04-02 02:00:01.0?或者将其作为2006-04-02 03:00:01.0并将其转换回2006-04-02 02:00:01.0的原始oracle值。
java oracle date jdbc dst
1个回答
1
投票

Java中的Date不存储时区。相反,它使用您的本地时区来表示值。这就是你看到不同结果的原因。

如果您使用Java 8和JDBC 4.2,则可能需要使用更可靠的java.time.*软件包。这很简单:

LocalDateTime dateTime = rs.getObject(index, LocalDateTime.class);

如果你想将LocalDateTime转换为java.util.Date,你可以这样做:

 Instant instant = dateTime.atZone(ZoneId.systemDefault()).toInstant();
 Date dateFromOld = Date.from(instant);
© www.soinside.com 2019 - 2024. All rights reserved.