我有时会对 java 中的不同 Date 类型及其实际用法感到困惑。这里 我试着总结一下我的理解
java.sql.Date :-
一个围绕毫秒值的薄包装器,允许 JDBC 将其识别为 SQL DATE 值
java.sql.Timestamp :-
java.util.Date 的薄包装器,允许 JDBC API 将其识别为 SQL
时间戳值。它通过允许规范增加了保存 SQL TIMESTAMP 小数秒值的能力
小数秒到纳秒的精度
我看到大多数项目更喜欢时间戳而不是日期。我认为这样做的主要原因是 Timestamp 可以保持值(value)直到 纳秒精度,而数据可以保持到毫秒。正确吗?
Calendar :-
此类专为日期操作而设计,例如:- 用于在特定时间和特定时间之间进行转换
一组日历字段,例如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等,以及用于操作日历字段,例如获取
下周的日期。虽然我不知道为什么当只有一个实现存在时这个类是抽象的,即 GregorianCalendar。
最佳答案
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
之外还有更多实现。如果你从 HotSpot 看到 Calendar#getInstance
的代码,你会看到它调用了 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
?因为您必须在提供时使用抽象类和接口(interface),而不是直接使用实现。这在此处得到了更好的解释:What does it mean to "program to an interface"?
除此之外,如果您要处理日期和时间,我建议使用类似 Joda-Time 的库它已经处理并解决了当前 Java Date API 的许多问题,并且还提供了在 java.util.Date
风格中检索此日期和时间对象的方法。
关于java - 日期与时间戳与日历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916666/