Java8新特性之:新的日期和时间API
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8新特性之:新的日期和时间API相关的知识,希望对你有一定的参考价值。
一. LocalDate、LocalTime、Instant、Duration以及Period
1.LocalDate只提供日期,不含当天时间信息
LocalDate date = LocalDate.of(2018, 5, 03); int year = date.getYear(); Month month = date.getMonth(); int day = date.getDayOfMonth(); DayOfWeek dow = date.getDayOfWeek(); int len = date.lengthOfMonth(); boolean leap = date.isLeapYear(); LocalDate today = LocalDate.now(); int year1 = date.get(ChronoField.YEAR); int month1 = date.get(ChronoField.MONTH_OF_YEAR); int day1 = date.get(ChronoField.DAY_OF_MONTH);
2.LocalTime:一天中的时间
LocalTime time = LocalTime.of(13, 45, 20); int hour = time.getHour(); int minute = time.getMinute(); int second = time.getSecond(); LocalDate localDate = LocalDate.parse("2014-03-24"); LocalTime localTime = LocalTime.parse("14:34:22");
3.LocalDateTime是LocalDate和LocalTime的合体
同时表示了日期和时间,单不带有时区信息,可以直接创建也可以通过合并日期和时间对象构造。
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(13, 45, 20); LocalDateTime dt4 = date.atTime(time); LocalDateTime dt5 = time.atDate(date); LocalDate date1 = dt1.toLocalDate(); LocalTime time1 = dt1.toLocalTime();
4.java.time.Instant类对时间建模的方式
基本上是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的秒数进行计算。
可以通过向静态工厂方法ofEpochSecond传递一个代表秒数的值创建一个该类的实例。
Instant instant1 = Instant.ofEpochSecond(3); Instant instant2 = Instant.ofEpochSecond(3, 0); Instant instant3 = Instant.ofEpochSecond(2, 1_000_000);//2秒之后再加上100万纳秒(1秒) Instant instant4 = Instant.ofEpochSecond(4, -1_000_000);//4秒之前的100万纳秒(1秒)
以上类都实现了Temporal接口。Temporal接口定义了如何读取和操纵为时间建模的对象的值。
5.Duration.between()两个对象之间的间隔
Duration d1 = Duration.between(time, time1); Duration d2 = Duration.between(dt1, dt2); Duration d3 = Duration.between(instant1, instant2);
6.Period类:以年、月或者日的方式对多个时间单位建模。
Period tenDays = Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18)); Duration threeMinutes = Duration.ofMinutes(3); Duration fourMinutes = Duration.of(4, ChronoUnit.MINUTES); Period elevenDays = Period.ofDays(11); Period threeWeeks = Period.ofWeeks(3); Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
日期-时间类中表示时间间隔的通用方法:
方法名 | 是否是静态方法 | 方法描述 |
between | 是 | 创建两个时间点之间的interval |
from | 是 | 由一个临时时间创建的interval |
of | 是 | 由它的组成部分创建的interval的实例 |
parse | 是 | 由字符串创建的interval的实例 |
addTo | 否 | 创建该interval的副本,并将其叠加到某个指定的temporal对象 |
get | 否 | 读取该interval的状态 |
isNegative | 否 | 检查该interval是否为负值,不包含零 |
isZero | 否 | 检查该interval的时长是否为零 |
minus | 否 | 通过减去一定的时间创建该interval的副本 |
multipliedBy | 否 | 将interval的值乘以某个标量创建该interval的副本 |
negated | 否 | 以忽略某个时长的方式创建该interval的副本 |
plus | 否 | 以增加某个指定的时长的方式创建该interval的副本 |
subtractFrom | 否 | 从指定的temporal对象中减去该interval |
二. 操纵、解析和格式化
1.LocalDate、LocalTime、LocalDateTime、Instant表示时间点的日期-时间类的通用方法:
他们都不会修改原来的对象。
方法名 | 是否静态方法 | 描述 |
from | 是 | 依据传入的Temporal对象创建对象实例 |
now | 是 | 依据系统时钟创建Temporal |
of | 是 | 由Temporal对象的某个部分创建该对象的实例 |
parse | 是 | 由字符串创建Temporal对象的实例 |
atOffset | 否 | 将Temporal对象和某个时区偏移相结合 |
atZone | 否 | 将Temporal对象和某个时区相结合 |
format | 否 | 使用某个指定的格式器将Temporal对象转换为字符串(Instant类不提供改方法) |
get | 否 | 读取Temporal对象的某一部分的值 |
minus | 否 | 创建Temporal对象的一个副本,通过将当前Temporal对象的值减去一定的时长创建该副本 |
plus | 否 | 创建Temporal对象的一个副本,通过将当前Temporal对象的值加上一定的时长创建该副本 |
with | 否 | 以该Temporal对象为模板,对某些状态进行修改创建该对象的副本 |
2.TemporalAdjuster类中的工厂方法
方法名 | 描述 |
dayOfWeekInMonth | 创建一个新的日期,它的值为同一个月中每一周的第几天 |
firstDayOfMonth | 创建一个新的日期,它的值为当月的第一天 |
firstDayOfNextMonth | 创建一个新的日期,它的值为下月的第一天 |
firstDayOfNextYear | 创建一个新的日期,它的值为明年的第一天 |
firstDayOfYear | 创建一个新的日期,它的值为当年的第一天 |
firstInMonth | 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值 |
lastDayOfMonth | 创建一个新的日期,它的值为当月的最后一天 |
lastDayOfNextMonth | 创建一个新的日期,它的值为下的最后一天 |
lastDayOfNextYear | 创建一个新的日期,它的值为明年的最后一天 |
lastDayOfYear | 创建一个新的日期,它的值为今年的最后一天 |
lastInMonth | 创建一个新的日期,它的值为同一个月中,最后一个符合星期几要求的值 |
next/previous | 创建一个新的日期,并将其值设定为日期调整后或调整前,第一个符合指定星期几要求的日期 |
nextOrSame/previousOrSame | 创建一个新的日期,并将其值设定为日期调整后或调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,直接返回该对象 |
3.打印输出及解析日期-时间对象
DateTimeFormatter:格式化及解析日期-时间对象。
与老的DateFormat相比较,DateTimeFormatter实例都是线程安全的。所以能够以单例模式创建格式器实例。
LocalDate date2 = LocalDate.of(2019, 4, 24); String s1 = date2.format(DateTimeFormatter.BASIC_ISO_DATE);//20190424 String s2 = date2.format(DateTimeFormatter.ISO_LOCAL_DATE);//2014-04-24 LocalDate date3 = LocalDate.parse("20190424", DateTimeFormatter.BASIC_ISO_DATE); LocalDate date4 = LocalDate.parse("2019-04-24", DateTimeFormatter.ISO_LOCAL_DATE);
DateTimeFormatter类还支持一个静态工厂方法,它可以按照某个特定的模式创建格式器
DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder() .appendText(ChronoField.DAY_OF_MONTH) .appendLiteral(". ") .appendText(ChronoField.MONTH_OF_YEAR) .appendLiteral(". ") .appendText(ChronoField.YEAR) .parseCaseInsensitive() .toFormatter(Locale.ITALIAN)
三. 处理不同的时区和历法
ZoneId:地区ID都为“{区域}/{城市}”的格式,这些地区集合的设定都由英特网编号分配机构(IANA)的时区数据库提供
ZoneId romeZone = ZoneId.of("Europe/Rome");
ZoneId对象可以与LocalDate、LocateDateTime或者是Instant对象整合起来,构造为一个ZoneDateTime实例,它代表了相对于指定时区的时间点。
LocalDate date7 = LocalDate.of(2014, Month.MARCH, 18); ZonedDateTime zdt1 = date7.atStartOfDay(romeZone); LocalDateTime dateTime = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45); ZonedDateTime zdt2 = dateTime.atZone(romeZone); Instant instant = Instant.now(); ZonedDateTime zdt3 = instant.atZone(romeZone);
以上是关于Java8新特性之:新的日期和时间API的主要内容,如果未能解决你的问题,请参考以下文章