Java基础知识点汇总 五 日期和时间

一、经典日期/时间 API

java.util.Date 类
java.sql.Date 类
java.util.Calendar 类
java.util.GregorianCalendar 类
java.util.TimeZone 类
java.sql.Time 类
java.sql.Timestamp 类

1、java.util.Date 类

        Date 类表示特定的时间,精度为毫秒。java.util 包的 Date 类实现了 Serializable、Cloneable 和 Comparable 接口。它提供了构造函数和方法来用java处理日期和时间。

        尚未弃用的构造函数

        Date():创建表示当前日期和时间的日期对象。

        Date(long milliseconds):为自 1970 年 1 月 1 日 00:00:00 GMT 以来的给定毫秒创建一个日期对象。

2、java.sql.Date

        构造函数,Date(long milliseconds),为自 1970 年 1 月 1 日 00:00:00 GMT 以来的给定毫秒创建一个 sql 日期对象。

3、​java.util.Calendar​

        Java Calendar 类是一个抽象类,它提供了在特定时刻和一组日历字段(如 MONTH、YEAR、HOUR 等)之间转换日期的方法。它继承了 Object 类并实现了 Comparable 接口。

4、java.util.GregorianCalendar

        GregorianCalendar 是 Calendar 的一个具体子类,并提供世界上大多数地方使用的标准日历系统。

5、java.util.TimeZone

        TimeZone 类用于表示时区偏移,也用于计算夏令时。

        设置时区参考代码

final TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
TimeZone.setDefault(timeZone);

6、java.sql.Time

        继承自java.util.Date 类,它允许 JDBC API 将其识别为 SQL TIME 值。 Time 类添加了格式化和解析操作以支持时间值的 JDBC 转义语法。

 7、java.sql.Timestamp

        继承自java.util.Date 类,它允许 JDBC API 将其识别为 SQL TIMESTAMP 值。 它增加了保存 SQL TIMESTAMP 小数秒值的能力,允许将小数秒指定为纳秒精度。 Timestamp 还提供格式化和解析操作以支持时间戳值的 JDBC 转义语法。

二、经典API存在的问题

        线程安全:原有的 Date 和 Calendar 类不提供线程安全。因此,它会导致开发人员需要注意的难以调试的并发问题。Java 8 的新日期和时间 API 提供线程安全且不可变,因此避免了开发人员的并发问题。

        糟糕的 API 设计:经典的日期和日历 API 不提供执行基本日常功能的方法。Java 8 中引入的 Date 和 Time 类以 ISO 为中心,并提供了许多不同的方法来执行有关日期、时间、持续时间和周期的操作。

        时区处理困难:使用经典的 Date 和 Calendar 类处理时区很困难,因为开发人员应该为其编写逻辑。使用新的 API,可以使用 Local 和 ZonedDate/Time API 轻松完成时区处理。

三、Java 8 日期/时间 API

        Java8 的 Date-Time API 中的大多数类都创建了 不可变的对象,这意味着对象创建后就无法修改。要更改不可变对象的值,必须将新对象构造为原始对象的修改副本。这也意味着 Date-Time API 根据定义是线程安全的。

java.time.LocalDate 类
java.time.LocalTime 类
java.time.LocalDateTime 类
java.time.MonthDay 类
java.time.OffsetTime 类
java.time.OffsetDateTime 类
java.time.Clock 类
java.time.ZonedDateTime 类
java.time.ZoneId 类
java.time.ZoneOffset 类
java.time.Year 类
java.time.YearMonth 类
java.time.Period 类
java.time.Duration 类
java.time.Instant 类
java.time.DayOfWeek 枚举
java.time.Month 枚举

        java.time.LocalDate:它表示 ISO 日历中的年月日,对于表示没有时间的日期很有用。它可用于表示仅日期信息,例如出生日期或结婚日期。

        java.time.LocalTime:它只处理时间。它对于表示一天中基于人的时间很有用,例如电影时间或本地图书馆的开放和关闭时间。

        java.time.LocalDateTime:它处理日期和时间,没有时区。它是 LocalDate 和 LocalTime 的组合。

// 获取当前时间
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 两种写法都可以
System.out.println(dateTimeFormatter.format(localDateTime));
System.out.println(localDateTime.format(dateTimeFormatter));

        java.time.ZonedDateTime:它将LocalDateTime类与ZoneId类中给出的区域信息相结合。它代表完整的日期时间戳以及时区信息。

        java.time.OffsetTime:它处理与格林威治/UTC 有相应时区偏移的时间,没有时区 ID。

        java.time.OffsetDateTime:它处理具有相对于格林威治/UTC 的相应时区偏移的日期和时间,没有时区 ID。

        java.time.Clock :它提供对任何给定时区的当前时刻、日期和时间的访问。尽管 Clock 类的使用是可选的,但此功能允许我们测试您的代码是否适用于其他时区,或者使用固定的时钟,其中时间不会改变。

        java.time.Instant :它表示时间轴上纳秒的开始(自 EPOCH 起),可用于生成表示机器时间的时间戳。发生在 epoch 之前的瞬间具有负值,发生在 epoch 之后的瞬间具有正值。

        java.time.Duration :两个瞬间之间的差异,以秒或纳秒为单位,不使用基于日期的构造,例如年、月和日,尽管该类提供了转换为日、小时和分钟的方法。

        java.time.Period :用于定义基于日期的值(年、月、日)中的日期之间的差异。

        java.time.ZoneId :它声明时区标识符并提供在 Instant 和 LocalDateTime 之间转换的规则。

        java.time.ZoneOffset :它描述了与格林威治/UTC 时间的时区偏移量。

        java.time.format.DateTimeFormatter :它提供了各种预定义的格式化程序,或者我们可以自己定义。它具有用于解析和格式化日期时间值的 parse() 或 format() 方法。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/124355776