gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:00 25 4
gpt4 key购买 nike

我有时会对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com