2016-05-16 3 views
0

Oracleの異なるテーブルに時間を格納するためにJavaのjava.sql.timestampおよびjava.util.dateを使用しています。すべてのOracle列はタイムスタンプです。Java Timestamp Oracleのタイムスタンプの異なるケースで12 PMを格納する際の異常な動作

12:02 PM時間(12:00〜12:59 PMの時間)を節約している間に問題が発生しています。それはここで12時02分AM

すなわち、それは正しいといくつかの間違ったで保存するいくつかのテーブルでは例は以下のとおりです。

1)Javaで:

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

新しい日付の上に()を返します - 」 Mon May 16 12:02:02 EST 2016 "

Oracleの列マッピングはタイムスタンプのみです。この特定の表では、Oracleタイムスタンプ - > "16/MAY/16 12:02:02.000000000 AM"が格納されています。 トランザクションとしてAMの代わりにPMでなければならないので間違っています。 は正午に実行されました。

上記の表では、Oracleのすべてのタイムスタンプには、末尾に000000000ミリ秒があります。 Javaでは

2):新日以上

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

は()を返します - "12時51分01秒EST 2016月5月16日"

Oracleの列マッピングは唯一のタイムスタンプです。この特定の表では、Oracleタイムスタンプを「16/MAY/16 16/MAY/16 12:51:01.170000000 PM」として保管します。それはPMだけでなければならないので正しいです。 上記の表では、Oracleのすべてのタイムスタンプには、末尾にms単位の値があります。 Javaの

3)

Date date = new Date(); 

店では、Oracleのタイムスタンプ列に直接日付と正常に動作します。 Oracle Columnには "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クラスはタイムゾーンを処理しません.1970年1月1日からのミリ秒数を示すabstract longのみを含みます。 printlnは現在のロケール( "EST")を文字列レンダリングに使用します。別のロケールを使用すると、時間の値が異なります。

Oracle自体には、 "TIMESTAMP WITH TIME ZONE"というデータ型があります。

Java 8を使用している場合は、タイムゾーンの周りの奇妙なことをすべて扱う新しいDate APIを使用することを強くお勧めします。さらに、すべてのタイムスタンプ値をGMTタイムゾーン(タイムゾーン0)で表現するように正規化し、タイムスタンプをこの正規化されたフォーマットでプログラムで保存し、人間入力rspにのみ転送することを推奨します。人間の読者のタイムスタンプをレンダリングするときは、フォーマットとタイムゾーンを考慮する必要があります。

+0

私はちょうど私の質問を修正しました。そのjava.sql.Timestamp。 私はJava 8を使用できません。プロジェクトではJava 6のみです。 Oracleの列では、午前12時2分が保存されます。その価値がどういうものなのか分からない。 –

関連する問題