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);

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

时间: 2024-07-30 10:54:05

Java8新特性之:新的日期和时间API的相关文章

java 8中新的日期和时间API

java 8中新的日期和时间API 使用LocalDate和LocalTime LocalDate的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息.另外,它也不附带任何与时区相关的信息 LocalDate实例提供了多种方法来读取常用的值,比如年份,月份,星期几等 LocalDate date = LocalDate.of(2014,3,18); int year = date.getYear(); Month month = date.getMonth(); int day =

Java 8的日期和时间API

本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍.Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API. 我们先从日期和时间的表示开始

计算机程序的思维逻辑 (95) - Java 8的日期和时间API

?本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍.Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API. 我们先从日期和时间的表示开

JDK8版本之日期和时间API详解

伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API.Java处理日期.日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限.Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们.全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant). 长

java8新特性——新日期和时间API

一.LocalDate,LocalTime,LocalDateTime LocalDate,LocalTime,LocalDateTime类的实例是不可改变的,分别表示使用ISO-8601日历系统的日期,时间,日期和时间.他们提供了简单的日期或时间,并不包含当前的时间信息.也不包含与地区相关的信息. //1.当前时间对象 LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); //2.自定义时间对象 LocalDateT

Kubernetes1.3新特性:新的资源回收控制器

(一)  核心概念 在kubernetes1.3中新增了一个资源回收控制器GarbaseCollector,用这个控制器来替代kubernetes1.3中的资源回收控制器GC. 如下为kubernetes1.2中的资源回收控制器结构体: 如下为kubernetes1.3中的资源回收控制器结构体: 在kubernetes1.2中,如果要实现对资源级联回收功能,需要通过客户端进行资源级联回收调用的方式实现,比如存在一个replica set类型的资源,在这个资源下面存在多个POD资源,如果我们使用命

HTML5 的新特性以及新标签的浏览器兼容问题

新特性: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 1)  拖拽释放(Drag and drop) API 2)  语义化更好的内容标签(header,nav,footer,aside,article,section) 3)  音频.视频API(audio,video) 4)  画布(Canvas) API 5)  地理(Geolocation) API 6)  本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失: 7

[PHP7.0-PHP7.2]的新特性和新变更

php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new-features.php http://php.net/manual/zh/migration71.new-features.php http://php.net/manual/zh/migration72.new-features.php PHP7.0 PHP7.0新特性 1. 组合比较符 (<

JDK14的新特性-Switch新功能

2020年3月17日,Oracle正式发布了JDK14版本,共新增了16项新特性 本文重点写一下关于switch的新功能: switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L ->”模式匹配语法作用于不同范围并控制执行流. JDK14之前的switch写法: public class SwitchTest { public static