デバッグしているアプリケーションの静的変数でイライラする問題に直面しています(自分でコーディングしていません)。
Transitsというmysqlデータベーステーブルがあります。Transitsには、「yyyy / MM / ddHH:mm:ss」形式の日付(eventdt)を保持する文字列列(varchar)があります。
対応するHibernateクラスには、eventdtの値を格納するDate変数があります。したがって、eventdtが読み取られると、コードはそれを文字列から日付に変換します。
コードは、変換を行うためにSimpleDateFormatを使用します。プログラマーは静的変数を使用してフォーマットを保持しましたが、残念ながらフォーマットエラーが発生しました。
private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
そのままにしておくと、正午のeventdt列に格納されているすべての日付は、対応するDate変数に深夜として格納されます。明らかにこれは望ましくないので、私はそれを修正しようとしました:
private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
ただし、コードは引き続き以前の形式「yyyy / MM / ddhh:mm:ss」を保持します。
私は静的変数を読み上げ、それをクリアするために考えられるすべてのことを行いました。コードを再コンパイルしてから、(Glassfish 3.1.1で)再デプロイしました。Netbeans(7.1.1)を再起動してから、再構築/再デプロイしました。Netbeansキャッシュをクリアし、同じプロセスを繰り返しました。次に、Glassfishのインストール全体を削除し、再起動してドメインを再作成し、キャッシュを再度クリアして、同じ再構築/再デプロイを実行しました。
また、コード自体を変更してみました。スレッドの問題かもしれないと思ったので、変数をstaticfinalに変更しました。
private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
次に、静的なfinal変数がフォーマット文字列になるように変更し、必要な各メソッドでDateFormatオブジェクトをインスタンス化しました。
// In class variable block
private static final String DATETIME_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss";
// In class methods
DateFormat df = new SimpleDateFormat(DATETIME_FORMAT_PATTERN);
私が何をしたとしても、同じ誤った形式「yyyy / MM / dd hh:mm:ss」が保持されます。
私がまだ行っていないと考えることができる唯一のことは、Netbeansを削除して再インストールすることです。私はどこかでそれを更新することも助けになったと読んだことがあります。古い静的変数をクリアするために、そこまで行く必要がありますか?
また、コードを同期ブロックに入れたり、スレッドセーフで初期化したりしたこともありません(ただし、ここでスレッドが問題になるかどうかはわかりませんが...)
アイデアが足りなくなったので、正しい方向へのご指導をいただければ幸いです。ありがとう!
編集:ここで要求されているのは、DateFormatを使用するコードです。lprは、Transitsテーブルとその他の必要なテーブルを統合するもう1つのHibernateオブジェクトです。
Date activityDate = null;
try {
activityDate = df.parse(getEventdt());
lpr.setActivityDateTime(activityDate);
} catch (Exception e) {
logger.warn("Unable to parse " + getEventdt() + " as a date.");
}