7

時間要素なしで日付 (年/月/日) を格納できる必要があります。これは、誕生日などの日付の抽象的な概念です。特定の瞬間ではなく、年の日付を表す必要があります。

入力テキストから日付を解析するために Java を使用しており、MySQL データベースに保存する必要があります。データベース、アプリケーション、またはクライアントがどのタイムゾーンにあるかに関係なく、それらはすべて同じ年/月/日を表示する必要があります。

私のアプリケーションは、データベース サーバーとは異なるシステム タイムゾーンのマシンで実行されますが、どちらも制御できません。日付を正しく保存するためのエレガントなソリューションはありますか?

私はこれらの解決策を考えることができますが、どちらもあまり良いとは思えません:

  • MySQL 接続のタイムゾーンを照会し、そのタイムゾーンで入力日付を解析します
  • 日付全体を文字列 yyyy-MM-dd として処理します
4

6 に答える 6

3

すべての時間/タイムゾーンのものをゼロにすることができます:

public static Date truncateDate(Date date)
    {
        GregorianCalendar cal = getGregorianCalendar();
        cal.set(Calendar.ZONE_OFFSET, 0); // UTC
        cal.set(Calendar.DST_OFFSET, 0); // We don't want DST to get in the way.

        cal.setTime(date);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.AM_PM, Calendar.AM);

        return cal.getTime();
    }
于 2008-11-12T22:39:23.003 に答える
2

現在のアプリケーション (jdbc を直接使用する単純なユーティリティ) での最善の方法は、文字列として直接挿入することであると結論付けました。より大きな Hibernate アプリの場合、わざわざ独自のユーザー タイプを作成することがあります。ただし、公開されているコードで誰かがまだこの問題を解決していないとは信じられません...

于 2008-11-14T21:42:40.023 に答える
0

このクラスjava.sql.Dateはまさにこの理由で存在します。残念ながら、単純に拡張java.util.Dateされ、手動で時間部分をゼロに設定する必要があるため、使用するのは非常に不便です。

于 2009-01-08T15:11:06.450 に答える
0

サーバーとデータベースが異なるタイムゾーンにあると指定しているため、解釈に問題があるようです。日付をゼロにするか、MM-dd-YYYY として保存すると、サーバーの日付またはデータベースの日付が保存されますか? サーバーでは午後 11 時、データベースでは翌日の午前 1 時である場合、「正しい」日付はどれですか? 今から 1 年後の日付を見ると、日付が依存しているマシンのタイムゾーンを覚えていますか?

これらの考慮事項は、少しやり過ぎかもしれません。しかし、なぜ日付を GMT で保存しないのでしょうか (必要に応じて秒をゼロにします)。

于 2008-11-15T01:07:22.200 に答える
0

DATEテーブルで MySQL 型を使用してから、insert ステートメントでフォーマットされた文字列を本質的に使用することはできませんか? このようなものは、タイムゾーンの調整を回避すると思います。

INSERT INTO time_table(dt) VALUES('2008-12-31')
于 2008-11-12T22:50:43.370 に答える