java - 日期与时间戳与日历?

标签 java date

我有时会对 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 , JapaneseImperialCalendarGregorianCalendar .此代码复制自 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/

相关文章:

javascript - 按值而非引用将日期插入数组

Javascript - 使用英国格式和 moment.js 创建新日期

java - 在 java 中使用 itext 生成 html 到 pdf

java - 赌徒毁灭模拟中的 "no. of trials"和 "bets count"有什么区别?

java - 如何不间断地显示我的导航栏内容?

date - 将八位数字转换为日期的最有效方法是什么?

java - 正则表达式适合所有不以已知后缀列表结尾的字符串(不是字符,而是单词)

java - 提交html表单数据到webflux HandlerFunction

c# - 如何从C#中的日期计算一天的开始和结束

php - 两个字段中两个日期之间的日期