有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java时间戳在Oracle时间戳中不同情况下存储12 PM的奇怪行为

我正在使用Java的Java。sql。时间戳和java。util。在Oracle的不同表中存储时间的日期。所有Oracle列都是时间戳

节省12:02 PM时间(12:00到12:59 PM之间的时间)时出现问题。在一些表格中,它存储正确的信息,而在一些表格中,它存储错误的信息,即12:02 AM

以下是案例:

1)在java中:

java.sql.TimeStamp timestamp = new Timestamp(new Date().getTime());

以上新日期()返回——“2016年5月16日星期一12:02:02东部标准时间”

Oracle列映射仅带有时间戳。在这个特定的表中,它将Oracle时间戳存储为->;“16/MAY/16 12:02:02.000000000 AM”。 这是错误的,因为它应该是下午,而不是上午的交易 中午处决

在上表中,Oracle中的所有时间戳的尾部都有000000000毫秒

2)在Java中:

java.sql.TimeStamp timestamp2 = new Timestamp(new Date().getTime());

以上新日期()返回——“2016年5月16日星期一12:51:01东部标准时间”

Oracle列映射仅带有时间戳。在这个特定的表中,它将Oracle时间戳存储为->;“16/MAY/16/MAY/16 12:51:01.170000000 PM”。这是正确的,因为它应该是下午只。 在上表中,Oracle中的所有时间戳在尾部都有一些毫秒值

3)在爪哇

Date date = new Date();

将日期直接存储在Oracle时间戳列中,效果良好。它存储 甲骨文专栏中的“16/MAY/16 12:02:03.446000000 PM”

我不明白为什么时间戳的用法如此不同

我正在使用Hibernate在数据库中插入对象

有人能帮忙吗

谢谢 尼汀


共 (1) 个答案

  1. # 1 楼答案

    我怀疑你的代码是否正确。没有java类。util。时间戳,但是一个java。sql。时间戳。“12:02 PM”对我来说毫无意义(实际上是第二天的“00:02 AM”)

    首先,应该明确区分时间戳值的内部格式和它的字符串表示形式(两边都是java和oracle)

    也许你的问题是基于你不考虑时间戳的时区(时间戳不)的事实。java Timestamp类不处理时区,它只包含一个抽象long,表示自1970年1月1日以来的毫秒数。println使用当前语言环境(“EST”)进行字符串呈现。使用另一个区域设置,可以得到不同的小时值

    Oracle本身提供了一种数据类型“带时区的时间戳”

    如果您使用的是Java8,我强烈建议您使用新的DateAPI,它可以处理时区周围所有奇怪的东西。此外,我建议将所有时间戳值标准化,以GMT时区(即时区0)表示,以编程方式以这种标准化格式保存和传输时间戳,并且仅在人工输入rsp上。在为人类读取器绘制时间戳时,应考虑格式和时区。