16

我有时会对 java 中不同的 Date 类型及其实际用法感到困惑。在这里我想总结一下我的理解

java.sql.Date :-毫秒值周围的瘦包装器,允许 JDBC 将其识别为 SQL DATE 值

java.sql.Timestamp :-一个围绕 java.util.Date 的瘦包装器,它允许 JDBC API 将其识别为 SQL TIMESTAMP 值。它增加了保存 SQL TIMESTAMP 小数秒值的能力,允许将小数秒指定为纳秒精度

我已经看到大多数项目更喜欢时间戳而不是日期。我认为主要原因是 Timestamp 可以将值保存到纳秒精度,而 Data 可以保存到毫秒。正确的?

Calendar :-此类设计用于日期操作,例如:- 用于在特定时刻和一组日历字段(例如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等)之间进行转换,以及用于操作日历字段,例如获取下周的日期。虽然我不知道为什么当只有一个实现存在时这个类是抽象的,即 GregorianCalendar。

4

3 回答 3

16

java.sql.Timestamp一个瘦包装器java.util.Date,允许 JDBC API 将其识别为 SQL TIMESTAMP 值。

如果您检查java.sql.TimestampJavaDoc,那么非常明确的是这个类是从(就像这样)扩展而来的。在现实世界的项目中,在将数据存储在数据库中时必须明确,主要是因为它存储日期和时间值,而只存储日期值。java.util.Datejava.sql.Datejava.util.Datejava.sql.Timestampjava.sql.Date

另一方面,java.util.Calendar它是抽象的,因为除了java.util.GregorianCalendar. 如果你看Calendar#getInstanceHotSpot 的代码,你会看到它调用了createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT)),并且这个方法代码使用了 3 个不同的日历BuddhistCalendarJapaneseImperialCalendarGregorianCalendar。此代码是从 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方法.

于 2013-07-29T05:37:44.810 回答
16
于 2015-10-06T17:22:51.313 回答
1

原始问题的第一行包含短语“java中的不同日期类型及其实际用法”

时间戳数据类型的实际用法正如它所说的那样 - SQL 使用时间戳来记录通常用于事务排序的精确时间值。时间戳通常仅在内部使用......其中纳秒计数。有外部时间戳数据的用例,但它们相对较少。

日期类型以毫秒精度处理 99% 的外部非科学数据需求。

于 2015-10-06T13:02:38.857 回答