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的主要内容,如果未能解决你的问题,请参考以下文章

JAVA8新特性-----新时间与日期API

java8新特性之 日期和时间

java8-新的日期API

java8新特性七-Date Time API

java8新特性七-Date Time API

Java8新特性——Lambda表达式之基本语法 & 自定义函数式接口