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
方法.