Java 8 日期时间 API

Java 8 时间 API:

  1. Instant
  2. Duration
  3. LocalDate
  4. LocalDateTime
  5. LocalTime
  6. ZonedDateTime
  7. DateTimeFormatter

Instant

Instant 表示某个时刻,表示从1970-01-01至今的秒数和纳秒数。

Instant API 使用示例:

// 1. 创建Instant对象
Instant instant = Instant.now();
Instant instant = Instant.ofEpochMilli(System.currentTimeMillis())
// 2. API
// 获取1970-01-01到现在的秒数
instant.getEpochSecond();
// 获取当前秒数的纳秒数
instant.getNano();
// 3. 时间计算
Instant i5s = instant.plusSeconds(5);
Instant i_5s = instant.minusSeconds(5);

需要注意的是:新API的日期时间都是不变的,时间计算返回的是新的值,原始值保持不变。

Duration

Duration 表示某段时长,即从一个时刻到另一个时刻的时长。

Duration API使用示例:

// 1. 计算两个时刻的时长
Instant first = Instant.now();
Instant second = first.plusSeconds(35);
Duration duration = Duration.between(first, second);
// 2. 创建时长 ofXxx
Duration duration = Duration.ofSeconds(5);
// 3. 转化时长 toXxx
long ms = duration .toMillis();
// 4. 时间计算,跟Instant一样

Duration 在超时参数使用上很有用,再也不用关注超时参数用单位是啥。

LocalDate

LocalDate 表示日期,不包含时间,也没有时区信息。

LocalDate API使用示例:

// 1. 创建LocalDate
LocalDate d = LocalDate.now();
LocalDate d = LocalDate.parse("2021-07-03", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate d = LocalDate.of(2021, 7, 2);
// 2. 调用API
d.getYear();
d.getMonthValue();
d.getDayOfMonth();
d.getDayOfWeek();
// 3. 格式化
DateTimeFormatter.ofPattern("yyyy-MM-dd").format(d)
// 4. 时间计算,跟Instant一样
// 5. 时间比较
d.isBefore(LocalDate.now());
d.isAfter(LocalDate.now());
d.isEqual(LocalDate.now());

LocalDateTime

LocalDateTime 表示日期时间,包含日期和时间,但没有时区信息。

LocalDateTime API使用示例:

// 1. 创建LocalDate
LocalDateTime dt = LocalDateTime.now();
LocalDateTime dt = LocalDateTime.parse("2021-07-03 11:22:33.8", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));
LocalDateTime dt = LocalDateTime.of(2021, 7, 2, 11, 22, 33, 8);
// 2. API
dt.getYear();
dt.getMonthValue();
dt.getDayOfMonth();
dt.getHour();
dt.getMinute();
dt.getSecond();
dt.getNano();
// 3. 格式化、时间计算、时间比较跟LocalDate一样。

LocalTime

LocalTime 表示时间,表示某天的某个时间,没有时区信息

LocalTime API使用示例:

// 1. 创建LocalTime
LocalTime t = LocalTime.now();
LocalTime t = LocalTime.parse("12:23:55", DateTimeFormatter.ofPattern("HH:mm:ss"));
LocalTime t = LocalTime.of(0, 7, 2);
// 2. 调用API
t.getHour();
t.getMinute();
t.getSecond();
t.getNano();
// 3. 格式化、时间计算、时间比较跟LocalDate一样。

ZonedDateTime

ZonedDateTime 跟LocalDateTime类似都是表示日期和时间,但是不同的是,ZonedDateTime是携带时区信息的。

ZonedDateTime API使用示例:

// 1.创建ZoneDateTime
ZonedDateTime dt = ZonedDateTime.now();
// 2. 调用API
dt.getYear();
dt.getMonthValue();
dt.getDayOfMonth();
dt.getDayOfWeek();
dt.getHour();
dt.getMinute();
dt.getSecond();
// 3. 格式化、时间计算、时间比较跟LocalDate一样。
// 4. 获取时区信息
dt.getZone();
dt.getOffset();

DateTimeFormatter

DateTimeFormatter 是一个用于格式化日期或时间为字符串形式的工具

DateTimeFormatter API使用示例:

// 时间转字符串
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(ZonedDateTime.now());
// 字符串转时间
LocalDateTime dt = LocalDateTime.parse("2021-07-03 11:22:33.8", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

Date和新API的转化

Date API和新日期API的转化有两个桥梁:
(1). Instant
(2). ZoneId

Date新增了两个API用于对接新API:
(1). toInstant();
(2). from();

LocalDateTime dt = LocalDateTime.from(new Date().toInstant().atZone(ZoneId.systemDefault()));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(dt));
        
Date d = Date.from(Instant.from(dt.atZone(ZoneId.systemDefault())));
ystem.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));

注意:不管是从Date转化为LocalDateTime,还是从LocalDateTime转化为Date都要指定时区信息。

posted @ 2021-07-04 16:36  HiIT青年  阅读(112)  评论(0编辑  收藏  举报