按照Java.sql.Timestamp中的原样检索Oracle日期/时间戳字段,而不转换为DST
我在oracle中有一列(LOGIN_TIME)和日期数据类型。我试图使用JDBC在Java中将其作为时间戳来读取。 对于此列,“我的表格”中的一行的值为2006-04-02 02:00:01.0。 当我这样做的时候 从表中选择LOGIN\u TIME,CAST(LOGIN\u TIME作为时间戳) 我看到sql开发人员将该值显示为 2006-04-02 02:00:01.0 但是当我使用ResultSet.getTimestamp()方法在Java中检索这个列值时,我看到的值是2006-04-02 03:00:01.0 经过大量的谷歌搜索,我明白了这一点按照Java.sql.Timestamp中的原样检索Oracle日期/时间戳字段,而不转换为DST,java,oracle,date,jdbc,dst,Java,Oracle,Date,Jdbc,Dst,我在oracle中有一列(LOGIN_TIME)和日期数据类型。我试图使用JDBC在Java中将其作为时间戳来读取。 对于此列,“我的表格”中的一行的值为2006-04-02 02:00:01.0。 当我这样做的时候 从表中选择LOGIN\u TIME,CAST(LOGIN\u TIME作为时间戳) 我看到sql开发人员将该值显示为 2006-04-02 02:00:01.0 但是当我使用ResultSet.getTimestamp()方法在Java中检索这个列值时,我看到的值是2006-04-
Java中的日期不存储时区。相反,它使用您的本地时区来表示值。这就是为什么你会看到不同的结果 如果您使用Java8和JDBC4.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);
Java中的日期不存储时区。相反,它使用您的本地时区来表示值。这就是为什么你会看到不同的结果 如果您使用Java8和JDBC4.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);
对不起,有点混乱。我已经编辑了我的问题。我的意思是说Oracle列数据类型是Date,我正试图使用resultSet.getTimestamp()在Java中将其作为时间戳读取;对不起,有点混乱。我已经编辑了我的问题。我的意思是说Oracle列数据类型是Date,我正试图使用resultSet.getTimestamp()在Java中将其作为时间戳读取;“默认时区是什么?”-
java.time.ZoneId.systemDefault().getId()
将返回JVM的当前默认时区。好的,这意味着JDBC将该值转换为JVM默认时区。这种情况是否只会发生在丢失/无效时间(由于节省日光而丢失的时间)和所有其他日期,jdbc会给我数据库中的实际值?是的,通常都是这样。那么,有没有办法按原样获取值?i、 e,如果它在oracle中存储为2006-04-02 02:00:01.0,那么有没有办法在没有jdbc默认转换的情况下获得相同的值?这就是java.time.LocalDateTime
的用途。只要你继续使用旧的和不推荐的java.sql.Timestamp
你就会被时区问题困扰。“默认时区是什么?”-java.time.ZoneId.systemDefault().getId()
将返回JVM的当前默认时区。好的,这意味着JDBC将该值转换为JVM默认时区。这种情况是否只会发生在丢失/无效时间(由于节省日光而丢失的时间)和所有其他日期,jdbc会给我数据库中的实际值?是的,通常都是这样。那么,有没有办法按原样获取值?i、 e,如果它在oracle中存储为2006-04-02 02:00:01.0,那么有没有办法在没有jdbc默认转换的情况下获得相同的值?这就是java.time.LocalDateTime
的用途。只要您继续使用旧的和不推荐的java.sql.Timestamp
,您就会被时区问题困扰。