• ベストアンサー

Date型からDate型への変換

Date型の変換について質問です。 Date dt = new Date(); とすると「Thu Jan 25 14:41:33 JST 2007」のような内容のDateオブジェクトが生成されますよね。 これを「2007-01-25 14:41:33.000115」のようにDBでよく使用される形式のDateオブジェクトに変換したいんです。 SimpleDateFormatのformatメソッドを使用して String文字列「2007-01-25 14:41:33.000115」に変換して SimpleDateFormatのparseメソッドを使用すれば 上手くいくかと思ったのですが 「Thu Jan 25 14:48:09 JST 2007」というDateオブジェクトが返されてしまいます。 どのようにすれば期待する動作を実現できるでしょうか? 初歩的な質問かもしれませんが、 有識者の方々ご教授いただけますでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>現在時刻は"EEE MMM dd HH:mm:ss zzz yyyy" 形式で取得されているため、 ↑はjava.util.Dateのインスタンスですか? であれば、 java.util.DateクラスのgetTimeメソッドでミリ秒を取得して、 そのミリ秒をコンストラクタへのパラメータとして java.sql.Timestampのインスタンスを生成してはどうでしょうか? java.util.Dateのインスタンスでないのであれば、 >SimpleDateFormatのformatメソッドを使用して >String文字列「2007-01-25 14:41:33.000115」に変換して >SimpleDateFormatのparseメソッドを使用すれば >上手くいくかと思ったのですが >「Thu Jan 25 14:48:09 JST 2007」というDateオブジェクトが返されてしまいます。 で取得できたjava.util.Dateのインスタンスからミリ秒を取得して、 …(以下省略)

CoolWolf
質問者

お礼

ご解答有難う御座います。 ご助言のとおり、Dateのインスタンスを Timestamp tmsp = new Timestamp(dt.getTime()); のようにしてtmspをKEYにすることで解決いたしました。 このような未熟者の質問にお時間を割いて頂き、どうも有難う御座いました。

その他の回答 (4)

回答No.5

Dateが得られているのならば static String getTimeStr(Date d) { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS"); return sdf.format(d); } Dateを得られていないのならば、上記メソッド+ static String parseDate(String datestr) throws ParseException { SimpleDateFormat sdf=new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH); Date d=sdf.parse(datestr); return getTimeStr(d); } でうまくいくと思います。 DateのtoStringは固定なので、日付の形式をいろいろ変えたい場合はDateFormatのformat(Date date)メソッドを使うのが一般的です。(DateFormatはabstractなのでSimpleDateFormatのオブジェクトを作るわけですが)

CoolWolf
質問者

お礼

DateFormatについての詳しいご教授有難う御座います。 こういった方法もあるんですね。 参考にさせて頂きます。 このような未熟者の質問にお時間を割いて頂き、皆様どうも有難う御座いました。 これにて質問を締め切らせて頂きます。

  • gyazae
  • ベストアンサー率40% (8/20)
回答No.4

根本的な設計の問題になってきますが、以下の対応でいかがでしょうか。 1.でレコードを取得する際に SELECT FOR UPDATE で排他制御を行う。 2.の処理を削除する。 3.を行い、 4.で3の結果と共に最終更新日時を現在時刻で UPDATE する。 5.(明示的にじゃなくてもいいけど)commitを行いロック解除する。 SQLを変更したくなければ、 1.で最終更新日時を取得する際にResultSet.getTimestampを利用する。 2.の処理を削除する。 3.を行い、 4.で1のTimestampを WHERE 句で利用し、3の結果と共に最終更新日時を現在時刻で UPDATE する。 どうしても今の形を残したいのであれば、ANo.3 の方法でいけると思います。

CoolWolf
質問者

お礼

ご解答有難う御座います。 2.の処理を削除することはNGが出ていたので pcbeginnerさんのご解答を参考に致しました。 このような未熟者の質問にお時間を割いて頂き、どうも有難う御座いました。

回答No.2

>DBでよく使用される形式のDateオブジェクト ってなんのことでしょうか? java.sql.Timestampのことでしょうか? 変換なんてしないで、最初からjava.sql.Timestampのインスタンスを生成すれば良いと思います。 (TimestampについてはJavaDocを見て下さい。) それともDateから変換しないといけないような制約でもあるのでしょうか。

  • gyazae
  • ベストアンサー率40% (8/20)
回答No.1

どのような処理を実現したいのでしょうか? 質問を見る限り、根本的に思い違いをされているようです。 java.util.Dateクラスは内部で「Thu Jan 25 14:41:33 JST 2007」形式の文字列を保持しているわけではありません。 toStringメソッドが呼ばれた際、内部データを元に "EEE MMM dd HH:mm:ss zzz yyyy" 形式の文字列を生成しているだけです。 なので、SimpleDateFormatのformat->parseをしても、等しいDateオブジェクトが返ってくるだけです。 「2007-01-25 14:41:33.000115」形式の文字列が必要であれば、その度にフォーマットしてやるか、文字列型として保持しておくしかないでしょう。

CoolWolf
質問者

お礼

解答有難う御座います。 質問はWEBアプリケーションの改修中で行き詰ったところなんですが、 なぜDate型から変換しているのかいいますと、 1.画面初期表示時にTBL01より該当のIDを持つレコードの最終更新日時を取得 2.登録ボタン押下時に、その日時をKEYに最終更新日時が初期表示時から変更されていなければUPDATE   (最終更新日時を現在時刻でUPDATEする) 3.UPDATEされたTBL01のUPDATE後の最新の情報を元に色々と計算処理を行う 4.計算結果を再度TBL01にUPDATEする   (この際に現在時刻をKEYにするべきだが現在時刻はそのままの形式だとTBL01と一致しない) 要するに排他処理なんですが、 もともとはAの画面で1.2.を行って Bの画面で3.4.を行っていたのを Aの画面で1~4をまとめて行うように仕様変更されたもので・・・・。 #もともとの作成者は既におらず、今日初めてソースを見た私に対応が回ってきて。 #まぁよくあることですが。 対応としては ・3の後にTBL01からもう一度、更新日時を取得して4のKEYとする~か ・3の更新に使った現在日時をKEYにUPDATEする~を考えたんですが 現在時刻は"EEE MMM dd HH:mm:ss zzz yyyy" 形式で取得されているため、 TBL01の最終更新日時「yyyy-MM-dd HH:mm:ss.SSSSSS」形式とは合わないんです。 (現在時刻取得処理は共有部品なので変えられません) なので"EEE MMM dd HH:mm:ss zzz yyyy" ⇒ 「yyyy-MM-dd HH:mm:ss.SSSSSS」 とする方法を探していたわけです。 どうにかなりませんでしょうか・・・・

関連するQ&A