java.sql.Timestamp
围绕 java.util.Date
的一个精简包装器,它允许 JDBC API 将其标识为 SQL TIMESTAMP 值。
如果您检查java.sql.Timestamp
JavaDoc,则非常明确地表明此类从(如java.sql.Date
)扩展。在现实世界的项目中,将数据存储在数据库中时必须简单明了,主要是因为它存储日期和时间值,而只存储日期值。java.util.Date
java.util.Date
java.sql.Timestamp
java.sql.Date
另一方面,它是抽象的,因为除了 之外,还有更多的实现。如果你看到来自 HotSpot 的代码,你会看到它调用 ,并且此方法代码使用 3 种不同的日历:BuddhistCalendar
、JapaneseImperialCalendar
和 GregorianCalendar
。此代码是从 JDK 7 源代码复制的:java.util.Calendar
java.util.GregorianCalendar
Calendar#getInstance
createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT))
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