java.sql.Timestamp
java.util.Date
JDBC API がこれを SQL TIMESTAMP 値として識別できるようにする薄いラッパー。
java.sql.Timestamp
JavaDocを確認すると、このクラスがから拡張されていることが非常に明確ですjava.util.Date
(java.sql.Date
そうです)。java.util.Date
また、実際のプロジェクトでは、データベースにデータを保存するときにプレーンにする必要があります。ほとんどの場合java.sql.Timestamp
、日付と時刻の値をjava.sql.Date
保存するだけでなく、日付の値を保存するためです。
一方、java.util.Calendar
は抽象的です。これは、 とは別に、これの実装が他にもあるためjava.util.GregorianCalendar
です。Calendar#getInstance
HotSpotの のコードを見ると、 を呼び出していることがわかりますcreateCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT))
。このメソッド コードは、 と の 3 つの異なるカレンダーを使用してBuddhistCalendar
いJapaneseImperialCalendar
ます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
フレーバーで取得するメソッドも提供しています。 .