基本概念

在计算机中,我们经常需要处理日期和时间。 这是日期: 2019-11-20 2020-1-1 这是时间: 12:30:59 2020-1-1 20:21:59 日期是指某一天,它不是连续变化的,而是应该被看成离散的。 而时间有两种概念,一种是不带日期的时间,例如,12:30:59。另一种是带日期的时间,例如,2020-1-1 20:21:59,只有这种带日期的时间能唯一确定某个时刻,不带日期的时间
基本概念

Date和Calendar

在计算机中,应该如何表示日期和时间呢? 我们经常看到的日期和时间表示方式如下: 2019-11-20 0:15:00 GMT+00:00 2019年11月20日8:15:00 11/19/2019 19:15:00 America/New_York 如果直接以字符串的形式存储,那么不同的格式,不同的语言会让表示方式非常繁琐。 在理解日期和时间的表示方式之前,我们先要理解数据的存储和展示。 当我们定
Date和Calendar

LocalDateTime

从Java 8开始,java.time包提供了新的日期和时间API,主要涉及的类型有: 本地日期和时间:LocalDateTime,LocalDate,LocalTime; 带时区的日期和时间:ZonedDateTime; 时刻:Instant; 时区:ZoneId,ZoneOffset; 时间间隔:Duration。 以及一套新的用于取代SimpleDateFormat的格式化类型DateTim
LocalDateTime

ZonedDateTime

LocalDateTime总是表示本地日期和时间,要表示一个带时区的日期和时间,我们就需要ZonedDateTime。 可以简单地把ZonedDateTime理解成LocalDateTime加ZoneId。ZoneId是java.time引入的新的时区类,注意和旧的java.util.TimeZone区别。 要创建一个ZonedDateTime对象,有以下几种方法,一种是通过now()方法返回当前
ZonedDateTime

DateTimeFormatter

使用旧的Date对象时,我们用SimpleDateFormat进行格式化显示。使用新的LocalDateTime或ZonedDateTime时,我们要进行格式化显示,就要使用DateTimeFormatter。 和SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的。线程的概念我们会在后面涉及到。现在我们只需要记住:因为SimpleDateF
DateTimeFormatter

Instant

我们已经讲过,计算机存储的当前时间,本质上只是一个不断递增的整数。Java提供的System.currentTimeMillis()返回的就是以毫秒表示的当前时间戳。 这个当前时间戳在java.time中以Instant类型表示,我们用Instant.now()获取当前时间戳,效果和System.currentTimeMillis()类似: import java.time.*; public c
Instant

最佳实践

由于Java提供了新旧两套日期和时间的API,除非涉及到遗留代码,否则我们应该坚持使用新的API。 如果需要与遗留代码打交道,如何在新旧API之间互相转换呢? 旧API转新API 如果要把旧式的Date或Calendar转换为新API对象,可以通过toInstant()方法转换为Instant对象,再继续转换为ZonedDateTime: // Date -> Instant: Instan
最佳实践