深入理解Java8新特性之新日期时间API的应用
简介
Java 8中新增加了新的日期时间API,该API提供了比老版本更多更好的特性,比如Date类容易被误用的缺陷在新API中得到很好的改进。本文将会深入讲解Java 8日期时间API,包括以下部分:
- 日期时间API的概览
- LocalDate的使用
- LocalTime的使用
- LocalDateTime的使用
- Instant的使用
- Duration和Period的使用
- 时区的支持
日期时间API的概览
新的日期时间API位于java.time包下,主要分为以下三大类:
- LocalDate/LocalTime/LocalDateTime:与java.util包中的Date和Calendar类相似,但更加易用和清晰,不包含时区信息。
- Instant:代替Date类,表示一个时间戳。
- Duration和Period:用于表示时间间隔(如:两个时间点之间相差几小时)或日期间隔(如:两个日期之间相差几天)。
LocalDate的使用
LocalDate表示不包含时间部分的日期,可以使用of()方法创建一个指定日期的对象,也支持解析字符串来创建LocalDate对象。例如:
LocalDate date = LocalDate.of(2021, 12, 31); // 创建2021年12月31日的LocalDate对象
LocalDate today = LocalDate.now(); // 获取当前日期
LocalDate dateFromStr = LocalDate.parse("2021-12-31");
LocalTime的使用
LocalTime表示不包含日期部分的时间,使用方法与LocalDate相似。同样提供了of()方法和parse()方法来创建对象,例如:
LocalTime time = LocalTime.of(15, 30, 45); // 创建一个时间为15:30:45的LocalTime对象
LocalTime now = LocalTime.now(); // 获取当前时间
LocalTime timeFromStr = LocalTime.parse("15:30:45");
LocalDateTime的使用
LocalDateTime表示同时包含日期和时间的对象,使用也与LocalDate和LocalTime类似。例如:
LocalDateTime dateTime = LocalDateTime.of(2021, 12, 31, 15, 30, 45); // 创建2021年12月31日15:30:45的LocalDateTime对象
LocalDateTime now = LocalDateTime.now(); // 获取当前日期和时间
LocalDateTime dateTimeFromStr = LocalDateTime.parse("2021-12-31T15:30:45");
Instant的使用
Instant类代表某个时间点(以UTC时区为基准),可以使用now方法获取当前时间点,也可以使用ofEpochSecond方法创建指定秒数的时间点。例如:
Instant now = Instant.now(); // 获取当前时间点
Instant instant = Instant.ofEpochSecond(1632284165); // 创建时间点为2021-09-22T15:22:45.765Z的对象
Duration和Period的使用
Duration表示两个时间点之间的持续时间,Period表示两个日期之间的间隔。例如:
Duration threeHours = Duration.ofHours(3); // 创建一个持续3小时的Duration对象
Duration between = Duration.between(LocalTime.of(10, 0, 0), LocalTime.of(12, 0, 0)); // 获取两个时间点之间的持续时间
Period oneYearThreeMonths = Period.of(1, 3, 0); // 创建一个持续1年3个月的Period对象
Period between = Period.between(LocalDate.parse("2000-01-01"), LocalDate.parse("2021-09-22")); // 获取两个日期之间的间隔
时区的支持
Java 8新日期API提供了对时区的支持,常用的类有ZoneId和ZoneOffset。使用方式如下:
ZoneId shanghaiZone = ZoneId.of("Asia/Shanghai"); // 创建上海时区
ZoneOffset offset = ZoneOffset.of("+08:00"); // 创建东八区
示例
- 计算两个日期之间相差的天数
LocalDate date1 = LocalDate.parse("2021-06-01");
LocalDate date2 = LocalDate.parse("2021-06-10");
long days = ChronoUnit.DAYS.between(date1, date2);
System.out.println("两个日期相差的天数:" + days);
- 处理时区的日期时间转换
假设我们已知了上海时间的LocalDateTime对象,要将其转换为美国洛杉矶时间,可以使用withZoneSameInstant()方法来处理。
LocalDateTime shanghaiTime = LocalDateTime.parse("2021-09-22T15:30:45");
System.out.println("上海时间:" + shanghaiTime);
ZoneId losAngelesZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime zonedDateTime = shanghaiTime.atZone(shanghaiZone);
ZonedDateTime losAngelesTime = zonedDateTime.withZoneSameInstant(losAngelesZone);
System.out.println("洛杉矶时间:" + losAngelesTime.toLocalDateTime());
输出如下:
上海时间:2021-09-22T15:30:45
洛杉矶时间:2021-09-22T00:30:45
以上就是Java 8新日期时间API的应用,我们可以看到,新API提供了多种方法来满足不同需求,并且易于使用,使用新API可以提高效率和代码质量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Java8新特性之新日期时间API的应用 - Python技术站