写点什么

Java- 技术专题 -LocalDate 和 LocalTime 和 LocalDateTime

发布于: 2020 年 10 月 30 日
Java-技术专题-LocalDate和LocalTime和LocalDateTime

概述

JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包中,下面是一些关键类:

  • LocalDate:表示日期,包含年月日,格式为 2019-10-16

  • LocalTime:表示时间,包含时分秒,格式为 16:38:54.158549300

  • LocalDateTime:表示日期时间,包含年月日,时分秒,格式为 2018-09-06T15:33:56.750

  • DateTimeFormatter:日期时间格式化类

  • Instant:时间戳,表示一个特定的时间瞬间

  • Duration:用于计算2个时间(LocalTime,时分秒)的距离

  • Period:用于计算2个日期(LocalDate,年月日)的距离

  • ZonedDateTime:包含时区的时间

LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象!

使用示例

LocalDate:获取日期时间的信息。格式为 2019-10-16

import java.time.LocalDate;

public class DD {
public static void main(String[] args) throws Exception {
// 创建指定日期
LocalDate fj = LocalDate.of(1985, 9, 23);
System.out.println("fj = " + fj);
// 得到当前日期
LocalDate nowDate = LocalDate.now();
System.out.println("nowDate = " + nowDate);
// 获取日期信息
System.out.println("年: " + nowDate.getYear());
System.out.println("月: " + nowDate.getMonthValue());
System.out.println("日: " + nowDate.getDayOfMonth());
System.out.println("星期: " + nowDate.getDayOfWeek());
}
}
//控制台打印:
fj = 1985-09-23
nowDate = 2020-07-23
年: 2020
月: 7
日: 23
星期: THURSDAY

LocalTime类: 获取时间信息。格式为 16:38:54.158549300

import java.time.LocalTime;
public class DD {
public static void main(String[] args) throws Exception {
// 得到指定的时间
LocalTime time = LocalTime.of(12,15, 28, 129_900_000);
System.out.println("time = " + time);
// 得到当前时间
LocalTime nowTime = LocalTime.now();
System.out.println("nowTime = " + nowTime);
// 获取时间信息
System.out.println("小时: " + nowTime.getHour());
System.out.println("分钟: " + nowTime.getMinute());
System.out.println("秒: " + nowTime.getSecond());
System.out.println("纳秒: " + nowTime.getNano());
}
}
//控制台打印:
time = 12:15:28.129900
nowTime = 15:13:40.778
小时: 15
分钟: 13
秒: 40
纳秒: 778000000


LocalDateTime类: 获取日期时间信息。格式为 2018-09-06T15:33:56.750

import java.time.LocalDateTime;
public class DD {
public static void main(String[] args) throws Exception {
LocalDateTime fj = LocalDateTime.of(1985, 9, 23, 9, 10, 20);
System.out.println("fj = " + fj);
// 得到当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println("now = " + now);
System.out.println("年: " + now.getYear());
System.out.println("月: " + now.getMonthValue());
System.out.println("日: " + now.getDayOfMonth());
System.out.println("小时: " + now.getHour());
System.out.println("分钟: " + now.getMinute());
System.out.println("秒: " + now.getSecond());
System.out.println("纳秒: " + now.getNano());
}
}
//控制台打印:
fj = 1985-09-23T09:10:20
now = 2020-07-23T15:17:59.243
年: 2020
月: 7
日: 23
小时: 15
分钟: 17
秒: 59
纳秒: 243000000


对日期时间的修改,对已存在的LocalDate对象,创建它的修改版,最简单的方式是使用withAttribute方法。withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。以下所有的方法都返回了一个修改属性的对象,他们不会影响原来的对象

import java.time.LocalDateTime;

public class DD {

public static void main(String[] args) throws Exception {
LocalDateTime now = LocalDateTime.now();
System.out.println("now = " + now);
// 修改日期时间
LocalDateTime setYear = now.withYear(2078);
System.out.println("修改年份: " + setYear);
System.out.println("now == setYear: " + (now == setYear));
System.out.println("修改月份: " + now.withMonth(6));
System.out.println("修改小时: " + now.withHour(9));
System.out.println("修改分钟: " + now.withMinute(11));
// 再当前对象的基础上加上或减去指定的时间
LocalDateTime localDateTime = now.plusDays(5);
System.out.println("5天后: " + localDateTime);
System.out.println("10年后: " + now.plusYears(10));
System.out.println("20月后: " + now.plusMonths(20));
System.out.println("20年前: " + now.minusYears(20));
System.out.println("5月前: " + now.minusMonths(5));
System.out.println("100天前: " + now.minusDays(100));
}
}
//控制台打印:
now = 2020-07-23T15:23:55.436
修改年份: 2078-07-23T15:23:55.436
now == setYear: false
修改月份: 2020-06-23T15:23:55.436
修改小时: 2020-07-23T09:23:55.436
修改分钟: 2020-07-23T15:11:55.436
5天后: 2020-07-28T15:23:55.436
10年后: 2030-07-23T15:23:55.436
20月后: 2022-03-23T15:23:55.436
20年前: 2000-07-23T15:23:55.436
5月前: 2020-02-23T15:23:55.436
100天前: 2020-04-14T15:23:55.436

比较、格式化与解析

在JDK8中,使用isBefore()、isAfter()、equals()方法来比较两个日期,可直接进行比较!

import java.time.LocalDate;

public class DD {
public static void main(String[] args) throws Exception {
LocalDate now = LocalDate.now();
LocalDate date = LocalDate.of(2018, 8, 8);
System.out.println(now.isBefore(date));
System.out.println(now.isAfter(date));
LocalDateTime now = LocalDateTime.now();
LocalDateTime now2 = LocalDateTime.of(1985, 9, 23, 9, 10, 20);
System.out.println(now.isAfter(now2));
System.out.println(now.isBefore(now2));
System.out.println(now.equals(now2));
}
}
//控制台打印:
false
true
true
false
false




import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DD {

public static void main(String[] args) throws Exception {
// 得到当前日期时间
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 将日期时间格式化为字符串
String format = now.format(formatter);
System.out.println("format = " + format);
// 将字符串解析为日期时间
LocalDateTime parse = LocalDateTime.parse("1985-09-23 10:12:22", formatter);
System.out.println("parse = " + parse);
}
}
//控制台打印:
format = 2020-07-23 15:28:24
parse = 1985-09-23T10:12:22


Instant、Duration、Period



import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;

public class DD {

public static void main(String[] args) throws Exception {
Instant now1 = Instant.now();
System.out.println("当前时间戳 = " + now1);

// Duration计算时间的距离
LocalTime now = LocalTime.now();
LocalTime time = LocalTime.of(14, 15, 20);
Duration duration = Duration.between(time, now);
System.out.println("相差的天数:" + duration.toDays());
System.out.println("相差的小时数:" + duration.toHours());
System.out.println("相差的分钟数:" + duration.toMinutes());

// Period计算日期的距离
LocalDate nowDate = LocalDate.now();
LocalDate date = LocalDate.of(1998, 8, 8);
Period period = Period.between(date, nowDate);
System.out.println("相差的年:" + period.getYears());
System.out.println("相差的月:" + period.getMonths());
System.out.println("相差的天:" + period.getDays());
}
}
//控制台打印:
当前时间戳 = 2020-07-23T07:32:20.326Z
相差的天数:0
相差的小时数:1
相差的分钟数:77
相差的年:21
相差的月:11
相差的天:15

JDK 8设置日期时间的时区

Java8 中加入了对时区的支持,LocalDate、LocalTime、LocalDateTime是不带时区的,带时区的日期时间类分别为:ZonedDate、ZonedTime、ZonedDateTime。

其中每个时区都对应着 ID,ID的格式为 “区域/城市” 。例如 :Asia/Shanghai 等。

ZoneId:该类中包含了所有的时区信息

import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class DD {
public static void main(String[] args) throws Exception {
// ZoneId.getAvailableZoneIds().forEach(System.out::println)可获取所有的时区ID;
// 获取计算机的当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println("now = " + now);
// now(Clock.systemUTC()): 创建世界标准时间
ZonedDateTime bz = ZonedDateTime.now(Clock.systemUTC());
System.out.println("bz = " + bz);
// now(): 使用计算机的默认的时区(东八区),创建日期时间
ZonedDateTime now1 = ZonedDateTime.now();
System.out.println("now1 = " + now1);
// 使用指定的时区创建日期时间
ZonedDateTime now2 = ZonedDateTime.now(ZoneId.of("America/Vancouver"));
System.out.println("now2 = " + now2);
}
}
//控制台打印:
now = 2020-07-23T15:39:16.286
bz = 2020-07-23T07:39:16.287Z
now1 = 2020-07-23T15:39:16.287+08:00[Asia/Shanghai]
now2 = 2020-07-23T00:39:16.288-07:00[America/Vancouver]


小结

  • LocalDate表示日期,包含年月日

  • LocalTime表示时间,包含时分秒

  • LocalDateTime = LocalDate + LocalTime

  • 时间的格式化和解析,通过DateTimeFormatter类型进行

学习了Instant类,方便操作秒和纳秒,一般是给程序使用的。学习Duration/Period计算日期或时间的距离,还使用时间调整器方便的调整时间,学习了带时区的3个类ZoneDate/ZoneTime/ZoneDateTime

JDK 8新的日期和时间 API的优势:

  • 新版的日期和时间API中,日期和时间对象是不可变的。操纵的日期不会影响老值,而是新生成一个实例

  • 新的API提供了两种不同的时间表示方式,有效地区分了人和机器的不同需求

  • 是线程安全的



用户头像

我们始于迷惘,终于更高的迷惘. 2020.03.25 加入

一个酷爱计算机技术、健身运动、悬疑推理的极客狂人,大力推荐安利Java官方文档:https://docs.oracle.com/javase/specs/index.html

评论

发布
暂无评论
Java-技术专题-LocalDate和LocalTime和LocalDateTime