プロが教えるわが家の防犯対策術!

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オブジェクトが返されてしまいます。

どのようにすれば期待する動作を実現できるでしょうか?

初歩的な質問かもしれませんが、
有識者の方々ご教授いただけますでしょうか。

A 回答 (5件)

どのような処理を実現したいのでしょうか?


質問を見る限り、根本的に思い違いをされているようです。

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」形式の文字列が必要であれば、その度にフォーマットしてやるか、文字列型として保持しておくしかないでしょう。
    • good
    • 0
この回答へのお礼

解答有難う御座います。

質問は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」
とする方法を探していたわけです。

どうにかなりませんでしょうか・・・・

お礼日時:2007/01/25 16:14

>DBでよく使用される形式のDateオブジェクト


ってなんのことでしょうか?
java.sql.Timestampのことでしょうか?
変換なんてしないで、最初からjava.sql.Timestampのインスタンスを生成すれば良いと思います。
(TimestampについてはJavaDocを見て下さい。)
それともDateから変換しないといけないような制約でもあるのでしょうか。
    • good
    • 0

>現在時刻は"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のインスタンスからミリ秒を取得して、
…(以下省略)
    • good
    • 0
この回答へのお礼

ご解答有難う御座います。

ご助言のとおり、Dateのインスタンスを
Timestamp tmsp = new Timestamp(dt.getTime());
のようにしてtmspをKEYにすることで解決いたしました。

このような未熟者の質問にお時間を割いて頂き、どうも有難う御座いました。

お礼日時:2007/01/26 00:22

根本的な設計の問題になってきますが、以下の対応でいかがでしょうか。



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 の方法でいけると思います。
    • good
    • 0
この回答へのお礼

ご解答有難う御座います。

2.の処理を削除することはNGが出ていたので
pcbeginnerさんのご解答を参考に致しました。


このような未熟者の質問にお時間を割いて頂き、どうも有難う御座いました。

お礼日時:2007/01/26 00:34

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のオブジェクトを作るわけですが)
    • good
    • 0
この回答へのお礼

DateFormatについての詳しいご教授有難う御座います。

こういった方法もあるんですね。
参考にさせて頂きます。


このような未熟者の質問にお時間を割いて頂き、皆様どうも有難う御座いました。
これにて質問を締め切らせて頂きます。

お礼日時:2007/01/26 00:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!