码迷,mamicode.com
首页 > 编程语言 > 详细

Java8新特性之:新的日期和时间API

时间:2018-05-27 18:59:53      阅读:205      评论:0      收藏:0      [点我收藏+]

标签: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   

原文地址:http://blog.51cto.com/turnsole/2120850

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!