16

Java のさまざまな Date 型とその実際の使用法に混乱することがあります。ここで、私の理解を要約しようとしています

java.sql.Date :-JDBC がこれを SQL DATE 値として識別できるようにするミリ秒値の薄いラッパー

java.sql.Timestamp :-JDBC API がこれを SQL TIMESTAMP 値として識別できるようにする java.util.Date の薄いラッパー。小数秒をナノ秒の精度で指定できるようにすることで、SQL TIMESTAMP 小数秒の値を保持する機能を追加します。

私は、ほとんどのプロジェクトが日付ではなくタイムスタンプを好むのを見てきました。これの主な理由は、タイムスタンプがナノ秒の精度まで値を保持できるのに対し、データはミリ秒まで保持できるためだと思います。正しい?

Calendar :-このクラスは、たとえば、日付操作用に設計されています。特定の時点と、YEAR、MONTH、DAY_OF_MONTH、HOUR などのカレンダー フィールドのセットとの間の変換、およびカレンダー フィールドの操作 (たとえば、次の週の日付。ただし、GregorianCalendar などの実装が 1 つしか存在しない場合に、このクラスが抽象である理由はわかりません。

4

3 に答える 3

16

java.sql.Timestampjava.util.DateJDBC API がこれを SQL TIMESTAMP 値として識別できるようにする薄いラッパー。

java.sql.TimestampJavaDocを確認すると、このクラスがから拡張されていることが非常に明確ですjava.util.Date(java.sql.Dateそうです)。java.util.Dateまた、実際のプロジェクトでは、データベースにデータを保存するときにプレーンにする必要があります。ほとんどの場合java.sql.Timestamp、日付と時刻の値をjava.sql.Date保存するだけでなく、日付の値を保存するためです。

一方、java.util.Calendarは抽象的です。これは、 とは別に、これの実装が他にもあるためjava.util.GregorianCalendarです。Calendar#getInstanceHotSpotの のコードを見ると、 を呼び出していることがわかりますcreateCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT))。このメソッド コードは、 と の 3 つの異なるカレンダーを使用してBuddhistCalendarJapaneseImperialCalendarますGregorianCalendar。このコードは、JDK 7 ソースからコピーされます。

private static Calendar createCalendar(TimeZone zone,
                                       Locale aLocale) {
    Calendar cal = null;

    String caltype = aLocale.getUnicodeLocaleType("ca");
    if (caltype == null) {
        // Calendar type is not specified.
        // If the specified locale is a Thai locale,
        // returns a BuddhistCalendar instance.
        if ("th".equals(aLocale.getLanguage())
                && ("TH".equals(aLocale.getCountry()))) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            cal = new GregorianCalendar(zone, aLocale);
        }
    } else if (caltype.equals("japanese")) {
        cal = new JapaneseImperialCalendar(zone, aLocale);
    } else if (caltype.equals("buddhist")) {
        cal = new BuddhistCalendar(zone, aLocale);
    } else {
        // Unsupported calendar type.
        // Use Gregorian calendar as a fallback.
        cal = new GregorianCalendar(zone, aLocale);
    }

    return cal;
}

では、なぜCalendarの代わりに を直接操作するのGregorianCalendarでしょうか? 実装を直接操作するのではなく、提供されたときに抽象クラスとインターフェイスを操作する必要があるためです。これはここでよりよく説明されています: 「インターフェイスにプログラムする」とはどういう意味ですか?

これとは別に、日付と時刻を扱う場合は、 Joda-Time のようなライブラリを使用することをお勧めします。このライブラリは、現在の Java Date API に関する多くの問題を既に処理および解決しており、この日付と時刻のオブジェクトをjava.util.Dateフレーバーで取得するメソッドも提供しています。 .

于 2013-07-29T05:37:44.810 に答える
16
于 2015-10-06T17:22:51.313 に答える
1

元の質問の最初の行には、「Java のさまざまな Date 型とその実際の使用法」というフレーズが含まれています。

タイムスタンプ データ型の実際の使用法はまさにそのとおりです。トランザクションの順序付けに通常使用される正確な時系列の値を記録するために SQL によって使用されるタイムスタンプです。タイムスタンプは通常、内部でのみ使用されます...ナノ秒がカウントされる場所。外部タイムスタンプ データの使用例はありますが、比較的まれです。

日付型は、外部の非科学的データのニーズの 99% をミリ秒の精度で処理します。

于 2015-10-06T13:02:38.857 に答える