2013-07-29 11 views
10

私は時々、javaのさまざまな日付タイプとその実用的な使い方について混乱します。ここ 私は私の理解に要約しようとしています日付とタイムスタンプ対カレンダー?

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

java.sql.Timestamp :- JDBCをjava.util.DateのラッパーこれをSQL TIMESTAMP値として識別するAPI。これは、SQL TIMESTAMPの小数点以下の秒の値を保持する機能を追加します。 分数秒の精度でナノ秒の精度を実現します。

ほとんどのプロジェクトで日付の代わりにタイムスタンプが使用されています。私はこの主な理由は、タイムスタンプが ナノ秒の精度までの値を保持できるのに対し、データはミリ秒まで保持できるということです。正しい?時間の特定の瞬間や、YEAR、MONTH、DAY_OF_MONTH、HOURなどのカレンダフィールドの セット間の変換のために、というように、カレンダーを操作する - :

Calendar :-このクラスは、例えば、日付操作のために設計されていますフィールドのように、 次のweek.Theoughの理由は、このクラスは抽象的な理由はわかりません1つの実装が存在する場合、すなわちGregorianCalendar。

答えて

13

java.sql.Timestampjava.util.Dateのthinラッパーで、JDBC APIがこれをSQL TIMESTAMP値として識別できるようにします。

あなたがjava.sql.Timestamp JavaDocをチェックすると、このクラスは(java.sql.Dateがするように)java.util.Dateからを拡張することが非常に明示的です。実際のプロジェクトでは、データベースにデータを格納する際にはjava.util.Dateを明示する必要があります。java.sql.Timestampは日付と時刻の値を格納するため、ほとんどの場合java.sql.Dateは日付値を格納するだけです。

一方、java.util.Calendarは、java.util.GregorianCalendarから離れたこの実装がさらに存在するため、抽象的なものです。 HotSpotからCalendar#getInstanceのコードが表示された場合はcreateCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT))が呼び出され、このメソッドコードではBuddhistCalendar,JapaneseImperialCalendarおよびGregorianCalendarの3種類のカレンダーが使用されています。このコードは、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を直接操作するために?実装で直接作業するのではなく、提供されたときに抽象クラスとインターフェイスで作業する必要があるからです。 What does it mean to "program to an interface"?

これ以外にも、日付と時刻を扱う場合は、Joda-Timeなどのライブラリを使用して、現在のJava Date APIの問題を解決して解決することをお勧めします。また、メソッドこの日付と時刻オブジェクトを取得するjava.util.Dateフレーバー。

1

最初の行の元の質問は、「Javaとその実用化に異なる日付タイプ」というフレーズが含まれてい

にtimestampデータ型の実用的な使い方は、それが言うとおりにある - SQLで使用されるタイムスタンプトランザクション注文に通常使用される正確な時系列値を記録します。タイムスタンプは通常、内部でのみ使用されます...ここで、ナノ秒がカウントされます。外部タイムスタンプデータの使用例がありますが、比較的まれです。

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

+0

は、私はあなたが(まだ関連について尋ねられたものではありませんでしたが、) 'java.util.Date'を意味集めます。 [Basil Bourqueの答え](https://stackoverflow.com/a/32975887/5772882)に沿って、代わりに 'java.time.Instant'を使用します。 –

4

あなたは最初のJavaの初期のバージョンにバンドルされてそれらの古い日付時刻クラスはハックとひどく設計されたクラスの混乱混乱していることを理解する必要があります。これは、日時処理のための洗練された施設での業界初の試みであり、そのためのクレジットに値するものです。しかし、最終的に彼らは失敗する。

彼らは、後のJava 8とに組み込まれた新しいjava.timeフレームワークに取って代わられています。

  • java.sql.Date - 利用java.time.LocalDate代わり
  • java.sql.Timestamp - 利用java.time.Instant代わり
  • java.util.Calendar & GregorianCalendar - 利用java.time.ZonedDateTime代わり

日付の場合のみ、なしの時刻や時間帯、使用LocalDate。 UTCでのタイムライン上の瞬間については、Instantを使用してください。インスタントに異なるタイムゾーンを割り当てるには、ZonedDateTimeを使用します。

は、データベース作業のために、我々は最終的には、直接これらの新しいjava.timeタイプを使用するように更新JDBCドライバが表示されるはずです。その間に、新しいクラスと古いクラスの両方で見つかった便利なコンバータメソッドを探します。日付のみの値にはjava.sql.Dateを使用します。日時の値にはjava.sql.Timestampを使用します。

それは他の多くの重複した質問に行われているように私はここのコードが含まれていませよ。 StackOverflowを検索してください。あなたは「日付タイプ」と言うとき

関連する問題