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.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」形式の文字列が必要であれば、その度にフォーマットしてやるか、文字列型として保持しておくしかないでしょう。
解答有難う御座います。
質問は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」
とする方法を探していたわけです。
どうにかなりませんでしょうか・・・・
No.2
- 回答日時:
>DBでよく使用される形式のDateオブジェクト
ってなんのことでしょうか?
java.sql.Timestampのことでしょうか?
変換なんてしないで、最初からjava.sql.Timestampのインスタンスを生成すれば良いと思います。
(TimestampについてはJavaDocを見て下さい。)
それとも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のインスタンスからミリ秒を取得して、
…(以下省略)
ご解答有難う御座います。
ご助言のとおり、Dateのインスタンスを
Timestamp tmsp = new Timestamp(dt.getTime());
のようにしてtmspをKEYにすることで解決いたしました。
このような未熟者の質問にお時間を割いて頂き、どうも有難う御座いました。
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 の方法でいけると思います。
ご解答有難う御座います。
2.の処理を削除することはNGが出ていたので
pcbeginnerさんのご解答を参考に致しました。
このような未熟者の質問にお時間を割いて頂き、どうも有難う御座いました。
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のオブジェクトを作るわけですが)
DateFormatについての詳しいご教授有難う御座います。
こういった方法もあるんですね。
参考にさせて頂きます。
このような未熟者の質問にお時間を割いて頂き、皆様どうも有難う御座いました。
これにて質問を締め切らせて頂きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- 英語 to date 2 2023/05/23 23:22
- Access(アクセス) ExcelのVBAコードについて教えてください。 4 2023/01/20 09:44
- Visual Basic(VBA) マクロについて教えてください。 1 2023/06/06 00:57
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) swiftで年号を 1 2023/02/05 06:48
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- JavaScript gasについて 1 2022/05/31 21:51
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#のクラスで値渡しをする
-
VB.netでメソッドからコントロ...
-
Javaでブラウザ判定
-
Excel VBA 定数にオブジェクト...
-
ArrayListのデバッグ方法について
-
VBAでの[]
-
GridViewに行追加するには?
-
servletからjspへオブジェクト...
-
String型からlong型への変換は...
-
VBスクリプトでテキストファイ...
-
JSPでのArrayListの表示につい...
-
UTF-8のテキストファイルを開く...
-
Dispose()は、どんな時に使うの...
-
JSTのDateオブジェクトが作...
-
getHeigth,getWidthについて
-
VBA Workbooks.open
-
サーブレットコンテキストの意...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
インスタンス参照でアクセスで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでの[]
-
エクセルVBA 画像を貼り付ける...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
Vba ListViewの行挿入に関して...
-
Excel VBA 定数にオブジェクト...
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
javaで、、、
-
VB.NETでのnothing の意義について
-
Dispose()は、どんな時に使うの...
-
ピクチャーボックスに点を打つ...
-
VBスクリプトでテキストファイ...
-
String型からlong型への変換は...
-
JSPでのArrayListの表示につい...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
エクセルVBA/SpecialCellsで特...
-
getParameter()について
-
VBS でのソート処理Excel2003
おすすめ情報