2016-05-16 245 views
0

我正在使用Java的java.sql.timestamp和java.util.date在Oracle的不同表中存储时间。所有的Oracle列都是时间戳。Java时间戳在Oracle中存储12位不同情况下的怪异行为时间戳

保存12:02 PM时间(12:00至12:59 PM之间的时间)时出现问题。在一些表中它存储正确的,在它的一些错误,即12:02

这里有情况:

1)在java中:

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

以上新的Date()返回 - “ Mon May 16 12:02:02 EST 2016“

Oracle列映射仅包含Timestamp。在此特定表中,它将Oracle时间戳存储为 - >“16/MAY/16 12:02:02.000000000 AM”。 这是错误的,因为它应该是PM而不是AM,因为在中午执行的交易是 。

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

2)在Java:

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

以上新的Date()返回 - “周一5月16日12时51分01秒EST 2016”

Oracle列映射只有时间戳。在此特定表中,它将Oracle时间戳存储为 - >“16/MAY/16 16/MAY/16 12:51:01.170000000 PM”。这是正确的,因为它应该只是PM。 在上面的表格中,Oracle中的所有时间戳都有一些值,以ms为单位。

3)在Java

Date date = new Date(); 

专卖店在甲骨文timestamp列直接日期和工作正常。它在Oracle列中存储 “16/MAY/16 12:02:03.446000000 PM”。

我不明白为什么时间戳的使用有这样的差异。

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

任何人都可以请在这里帮忙吗?

感谢 尼廷

+0

你如何将它插入数据库?你是否将它作为绑定参数传递?或者作为一个字符串使用动态SQL? – MT0

+0

显示错误时间的列是实际日期而不是时间戳吗?我知道你说他们都是时间戳,但这似乎并不完全正确 - 失去秒数表明他们可能并不全是。或者是一些简单的时间戳,其他都与时区或当地时区?如果是这样,你可以检查会话的NLS设置 - 我怀疑有一个隐式转换或转换从12小时转换为24小时格式。但是,您的实际NLS值将有助于正确解释。 –

+0

@ MT0:我使用Hibernate进行数据库插入。 –

回答

0

我对你的代码的正确性怀疑。没有java.util.Timestamp类,而是java.sql.Timestamp。而“12:02 PM”对我来说没有意义(实际上是第二天的“00:02 AM”)。

您应该首先明确区分时间戳值的内部格式与其字符串表示形式(双方:java和oracle)。

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

Oracle本身提供了一个数据类型“TIMESTAMP WITH TIME ZONE”。

如果您使用的是java 8,我强烈推荐使用新的Date API,它处理时区周围的所有奇怪的东西。此外,我建议将所有时间戳值标准化为以GMT时区(即时区0)表示的时间戳,以编程方式保存并以此标准化格式传输时间戳,并仅在人类输入rsp上传输时间戳。当为人类阅读器呈现时间戳时,应考虑格式和时区。

+0

我刚纠正了我的问题。它的java.sql.Timestamp。 而且我不能使用Java 8.只在项目中使用Java 6。在oracle列中,存储12:02 AM。不知道这个价值会如何。 –