最新要闻
- iPhone/iPad全系可用:闪魔MFi苹果认证线21.8元大促 世界简讯
- 4月轿车销量排名出炉 燃油车新能源“混战” 好戏即将开场
- 环球时讯:某日系车一把手摊牌了:现在最害怕比亚迪
- 格局有了!SteamDeck官方庆祝ROG Ally开卖
- 精彩看点:深圳某公司母亲节放假3天不调休:和妈妈度过完整的母亲节
- 驾特斯拉遭遇车祸后 林志颖现身珠海首次参加赛车比赛:状态良好
- 战斗力爆表!无人机航拍时被鹰叼走:画面剧烈晃动
- 高通骁龙8 Gen2下放!一加Ace2 Pro曝光
- 曾盛赞比亚迪股票的巴菲特又减持了!本人回应:不想跟马斯克的特斯拉竞争
- 不止安装失败!Win11 KB5026372更新出现诸多问题 天天观天下
- “原神玩家”和“塞尔达玩家”打起来了?不过是恶臭互联网的又一次狂欢_世界新消息
- 别了机械硬盘?全固态玩家转向了当“垃圾佬”
- 全系2.0T+8AT比BBA香多了!新款林肯冒险家上市:24.58万起
- 环球即时看!最大96GB内存不是梦!笔记本将迎来单条48GB DDR5内存
- 7499元 华硕天选4R游戏本上架:锐龙7-7735H、165Hz高刷
- 取代C++!微软改用Rust语言重写的Win11内核:正式来了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
JDK8 新特性之新的日期&时间API,一篇讲清楚!
本系列为:从零开始学Java,为千锋教育资深Java教学老师独家创作
致力于为大家讲解清晰Java相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~
【资料图】
技术类问题,也欢迎大家和我们沟通交流!
前言
在上一篇文章中本系列内容给大家讲解了Java里的格式化问题,这样我们就可以个性化设置日期时间的展示方式了。似乎我们现在已经掌握了不少关于日期和时间的操作技巧,但其实随着时间的不断推移,现实的需求也在不断更新,原先的一些API已经难以满足开发需求了。所以从JDK8之后,为了满足更多的开发需求,Java给我们增加了不少关于日期时间的新特性,接下来本篇文章就带各位来看看这些新特性有哪些。
全文大约 【5400】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......
一.新特性概述
在JDK8之前,其实有不少的API都存在着一些问题,日期时间等相关类同样如此。所以从JDK8开始,Java做了较大的改动,出现了很多新特性。其中,java.time包中了就提供了不少新的日期和时间API,主要如下:
●本地日期和时间类:LocalDateTime,LocalDate,LocalTime;
●带时区的日期和时间类:ZonedDateTime;
●时刻类:Instant;
●时区:ZoneId,ZoneOffset;
●时间间隔:Duration。
在格式化操作方面,也推出了一个新的格式化类DateTimeFormatter
。
和之前那些旧的API相比,新的时间API严格区分了时刻、本地日期、本地时间和带时区的日期时间,日期和时间的运算更加方便。这些新的API类型几乎全都是final不变类型,我们不必担心其会被修改。并且新的API还修正了旧API中一些不合理的常量设计:
●Month的范围采用1~12,分别表示1月到12月;
●Week的范围采用1~7,分别表示周一到周日。
二.LocalDateTime
1.简介
LocalDateTime
是JDK8之后出现的,用来表示本地日期和时间的类。我们可以通过now()方法,默认获取到本地时区的日期和时间。与之前的旧API不同,LocalDateTime、LocalDate和LocalTime
默认会严格按照ISO8601规定的日期和时间格式进行打印。
2.获取当前日期和时间
我们可以通过now()方法来获取到当前的日期和时间。我们在执行一行代码时,多少也会消耗一点时间,日期和时间的值可能会对不上,尤其是时间的毫秒数可能会有差异。所以为了保证获取到的日期和时间值差异减少,我们的代码尽量要编写如下:
import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;public class Demo10 {public static void main(String[]args) {//获取当前日期和时间LocalDateTimedt= LocalDateTime.now();System.out.println("dt="+dt);//转换到当前日期LocalDated=dt.toLocalDate(); System.out.println("date="+d);//转换到当前时间LocalTimet=dt.toLocalTime(); System.out.println("time="+t);}}
3.of()方法的作用
我们可以通过of()方法,根据指定的日期和时间来创建一个LocalDateTime
对象,用法如下:
import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;public class Demo11 {public static void main(String[]args) {//根据指定的日期和时间创建LocalDateTime对象//2023-01-25,月份与之前不同:1-12分别表示1-12个月LocalDatedate= LocalDate.of(2023, 1, 25);//20:35:48LocalTimetime= LocalTime.of(20, 35, 48);LocalDateTimedt1= LocalDateTime.of(date,time);System.out.println("dt1=" +dt1);LocalDateTimedt2= LocalDateTime.of(2023, 1, 23, 20, 35, 48);System.out.println("dt2=" +dt2);}}
4.parse()方法的作用
我们可以使用parse()方法,将一个时间格式的字符串解析为LocalDateTime
,用法如下:
import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;public class Demo11 {public static void main(String[]args) {//解析时间字符串。T是日期和时间的分隔符LocalDateTimedt= LocalDateTime.parse("2023-02-22T20:18:15");System.out.println("dt="+dt);LocalDatedate= LocalDate.parse("2012-10-15");System.out.println("date="+date);LocalTimetime= LocalTime.parse("16:15:20");System.out.println("time="+time);}}
我们要注意,根据ISO8601规定,日期和时间的分隔符是T,标准格式如下:
●日期:yyyy-MM-dd
●时间:HH:mm:ss
●带毫秒的时间:HH:mm:ss.SSS
●日期和时间:yyyy-MM-dd"T"HH:mm:ss
●带毫秒的日期和时间:yyyy-MM-dd"T"HH:mm:ss.SSS
5.时间加减方法
在LocalDateTime
中,给我们提供了一系列的加减操作方法,使得我们可以很轻易的实现时间的加减操作,比如给某个日期或时间进行加或减的操作。plusXxx()增加方法如下图所示:
minusXxx()减少方法如下图所示:
import java.time.LocalDateTime;public class Demo13 {public static void main(String[]args) {//对日期进行加减操作LocalDateTimedt1= LocalDateTime.now();System.out.println("dt1=" +dt1); //加3天减6小时: LocalDateTimedt2=dt1.plusDays(3).minusHours(6); //2019-10-31T17:30:59 System.out.println("dt2=" +dt2); //减1月: LocalDateTimedt3=dt2.minusMonths(1); //2019-09-30T17:30:59 System.out.println("dt3=" +dt3); //加两周 LocalDateTimedt4=dt3.plusWeeks(2); System.out.println("dt4=" +dt4); }}
6.时间调整方法
我们除了可以进行日期和时间的增加、减少操作之外,还可以利用withXxx()
方法对日期和时间进行调整,这些方法如下图所示:
从上图可以看出,我们可以对年、月、日、时、分、秒等进行调整,具体含义如下:
●调整年:withYear()
●调整月:withMonth()
●调整日:withDayOfMonth()
●调整时:withHour()
●调整分:withMinute()
●调整秒:withSecond()
import java.time.LocalDateTime;public class Demo14 {public static void main(String[]args) {//对日期进行加减操作LocalDateTimedt1= LocalDateTime.now();System.out.println("dt1=" +dt1);//注意:如果某个月中没有29、30、31等日期,会出现java.time.DateTimeException:Invaliddate"FEBRUARY31"类似的异常。 //LocalDateTimedt2=dt1.withDayOfMonth(31);//日期变为25日 LocalDateTimedt2=dt1.withDayOfMonth(25); System.out.println("dt2="+dt2); //2019-10-31T20:30:59 //月份变成5月 LocalDateTimedt3=dt2.withMonth(5); //2023-05-25T20:06:06.768 System.out.println("dt3="+dt3); //年份变成2024年 LocalDateTimedt4=dt3.withYear(2024); //2024-05-25T20:06:06.768 System.out.println("dt4=" +dt4); }}
我们在利用withXxx()
方法调整时间是,在调整月份时,会相应地调整日期。并且要注意,如果某个月中没有29、30、31等日期,会出现java.time.DateTimeException:Invaliddate"FEBRUARY31"
类似的异常,如下图:
7.with()方法
LocalDateTime
中有一个通用的with()方法
,允许我们进行更复杂的运算,比如获取当月或下个月的第一天、最后一天、第一个周一等操作。
import java.time.DayOfWeek;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.temporal.TemporalAdjusters;public class Demo14 {public static void main(String[]args) { //获取本月的第一天0:00时刻: LocalDateTimefirstDay= LocalDate.now().withDayOfMonth(1).atStartOfDay(); System.out.println("firstDay="+firstDay); //获取本月的最后1天: LocalDatelastDay= LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); System.out.println("lastDay="+lastDay); //获取下个月的第1天: LocalDatenextMonthFirstDay= LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth()); System.out.println("nextMonthFirstDay="+nextMonthFirstDay); //获取本月的第1个周一 LocalDatefirstWeekday= LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); System.out.println("firstWeekday="+firstWeekday);}}
8.isBefore()与isAfter()方法
如果我们判断两个LocalDateTime
的先后顺序,可以使用isBefore()、isAfter()
方法。
import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;public class Demo16 {public static void main(String[]args) {LocalDateTimenow= LocalDateTime.now(); LocalDateTimetarget= LocalDateTime.of(2022, 12, 25, 10, 15, 10); //判断A日期在B日期之前 System.out.println("before?="+now.isBefore(target)); //判断A日期在B日期之前 System.out.println(LocalDate.now().isBefore(LocalDate.of(2023, 12, 19))); //判断A时间在B时间之后 System.out.println(LocalTime.now().isAfter(LocalTime.parse("10:15:20")));}}
9.Duration时间间隔和Period间隔天数
我们可以使用Duration
表示两个时刻之间的时间间隔,用Period
表示两个日期之间的间隔天数。
Duration
和Period
的表示方法也符合ISO8601的格式,它以P...T...的形式表示。P...T之间表示日期间隔,T后面表示时间间隔,如果是PT...的格式表示仅有时间间隔。
所以如果是两个LocalDateTime
之间的差值,要使用Duration
表示,形式为PT12H10M30S,意思是间隔12小时10分钟30秒。而两个LocalDate之间的差值用Period表示,形式为P1M21D,表示间隔1个月21天。
import java.time.Duration;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.Period;public class Demo17 {public static void main(String[]args) {LocalDateTimestart= LocalDateTime.of(2023, 05, 24, 13, 15, 20); LocalDateTimeend= LocalDateTime.of(2025, 11, 8, 19, 25, 30); //计算两个时间的间隔 Durationd= Duration.between(start,end); //PT21582H10M10S,间隔21582小时10分10秒 System.out.println("duration="+d); //计算两个日期的间隔 Periodp= LocalDate.of(2022, 12, 11).until(LocalDate.of(2025, 2, 22)); //P2Y2M11D,间隔2个月11天 System.out.println("period="+p); //我们也可以使用ofXxx()或parse()方法直接创建Duration //10hours Durationd1= Duration.ofHours(10); //2day,4hours,5minutes Durationd2= Duration.parse("P2DT4H5M"); System.out.println("d1="+d1); System.out.println("d2="+d2); }}
三.ZonedDateTime
1.简介
我们知道,LocalDateTime
表示本地日期和时间,如果我们要表示一个带时区的日期和时间,就需要使用ZonedDateTime
了。ZonedDateTime
相当于是LocalDateTime+ZoneId
,其中ZoneId是java.time引入的新的时区类,它与旧的java.util.TimeZone是有区别的。在ZonedDateTime中也提供了plusDays()等加减操作,使用起来也非常地方便。
2.创建方式
如果我们想要创建一个ZonedDateTime
对象,可以有以下几种方法:
●通过now()方法返回ZonedDateTime对象;
●通过给LocalDateTime附加ZoneId获取。
接下来我们就通过一些具体的案例来给大家展示一下ZonedDateTime
到底是怎么创建的
2.1now()方法
我们先来看看通过now()方法如何创建一个ZonedDateTime
对象。
import java.time.ZoneId;import java.time.ZonedDateTime;public class Demo18 {public static void main(String[]args) {//获取默认时区的时间对象ZonedDateTimezdt1= ZonedDateTime.now(); System.out.println("zdt1="+zdt1); //获取指定时区的时间对象 ZonedDateTimezdt2= ZonedDateTime.now(ZoneId.of("America/New_York")); System.out.println("zdt2="+zdt2); }}
在这个案例中,我们获得的两个ZonedDateTime
对象,它们的时区虽然不同,但时间都是同一时刻的,如果毫秒数不同是在执行语句时有一点时间差。
2.2附加ZoneId
我们再来通过给LocalDateTime
附加ZoneId的方式来获取一个LocalDateTime
对象。
import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZonedDateTime;public class Demo19 {public static void main(String[]args) {LocalDateTimeldt= LocalDateTime.of(2023, 1, 25, 10, 15, 11);//获取默认时区的时间对象ZonedDateTimezdt1=ldt.atZone(ZoneId.systemDefault());System.out.println("zdt1=" +zdt1);//获取指定时区的时间对象ZonedDateTimezdt2=ldt.atZone(ZoneId.of("America/New_York"));System.out.println("zdt2=" +zdt2);}}
这种方式创建的ZonedDateTime
对象,其日期和时间与LocalDateTime
相同,但附加的时区不同,因此是两个不同的时刻。
3.时区转换
有时候我们的项目中,需要将A时区的时间转换成B时区的时间,要在两个时区直接进行切换。以前的时候就需要我们自己计算,非得的麻烦且复杂,现在新的JavaAPI中直接给我们带了负责时区转换的方法。比如withZoneSameInstant()方法,就可以将一个关联的时区转换到另一个时区,转换后的日期和时间也会相应调整。
import java.time.ZoneId;import java.time.ZonedDateTime;public class Demo20 {public static void main(String[]args) {//将北京时间转为纽约时间//获取北京时区的当前时间//注意:这里的时区名字不能随便瞎写,否则会产生java.time.zone.ZoneRulesException:Unknowntime-zoneID:Asia/Beijing ZonedDateTimezdt1= ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); System.out.println("zdt1=" +zdt1); //将当前时区的时间,转换为纽约时间 ZonedDateTimezdt2=zdt1.withZoneSameInstant(ZoneId.of("America/New_York"));System.out.println("zdt2=" +zdt2); //转换为本地时间LocalDateTimeldt=zdt2.toLocalDateTime();System.out.println("ldt=" +ldt);}}
注意:
时区的名字不能随便瞎写,否则会产生java.time.zone.ZoneRulesException:Unknowntime-zoneID:Asia/Beijing
,如下图所示:
而且在时区转换时,由于夏令时的存在,不同的日期转换结果也有可能是不同的,有可能会出现两次转换后有1小时的夏令时时差。我们以后涉及到时区时,尽量不要自己计算时差,否则难以正确处理夏令时。
四.DateTimeFormatter
1.简介
我们在前面学习Date日期时间对象时,知道该对象默认输出的时间格式其实是不符合大多数的使用场景的,所以就需要我们对其进行格式化设置,比如通过printf()
方法或SimpleDateFormat
类来实现。但是当我们使用新的LocalDateTime
或ZonedDateTime
需要进行格式化显示时,就要使用新的DateTimeFormatter
类了。
和SimpleDateFormat
不同的是,DateTimeFormatter
不但是不可变的对象,且还是线程安全的。在代码中,我们可以创建出一个DateTimeFormatter
实例对象,到处引用。而之前的SimpleDateFormat
是线程不安全的,使用时只能在方法内部创建出一个新的局部变量。
2.创建方式
我们要想使用DateTimeFormatter
,首先得创建出一个DateTimeFormatter
对象,一般有如下两种方式:
●DateTimeFormatter.ofPattern(Stringpattern):pattern是待传入的格式化字符串;
●DateTimeFormatter.ofPattern(Stringpattern,Localelocale):locale是所采用的本地化设置。
3.基本使用
了解了创建方式之后,我们就可以来看看该如何进行时间格式化了。
import java.time.ZonedDateTime;import java.time.format.DateTimeFormatter;import java.util.Locale;public class Demo21 {public static void main(String[]args) {//获取默认的本地时间ZonedDateTimezdt= ZonedDateTime.now();//获取一个DateTimeFormatter对象,如果需要输出固定字符,可以用"xxx"表示,如"中国时间" varformatter= DateTimeFormatter.ofPattern("yyyy-MM-dd"T"HH:mm:ssZZZZ"中国时间""); System.out.println(formatter.format(zdt)); //获取一个DateTimeFormatter对象,中国时区 varzhFormatter= DateTimeFormatter.ofPattern("yyyyMMMddEEHH:mm:ss", Locale.CHINA); System.out.println(zhFormatter.format(zdt)); //改变默认的显示格式,用指定的格式显示 //System.out.println(DateTimeFormatter.ISO_DATE.format(zdt)); //获取一个DateTimeFormatter对象,美国时区 varusFormatter= DateTimeFormatter.ofPattern("E,MMMM/dd/yyyyHH:mm:ss", Locale.US); //System.out.println(usFormatter.format(zdt)); //改变默认的显示格式 System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(zdt));}}
当我们在格式化字符串时,如果需要输出一些固定的字符,可以用"xxx"的形式来表示。
另外我们在调用System.out.println()
方法对一个ZonedDateTime
,或者LocalDateTime
实例进行打印时,实际上调用的是它们的toString()
方法。默认的toString()
方法,显示的字符串是按照ISO8601格式显示的,我们可以通过DateTimeFormatter
预定义的几个静态变量来引用。
五.Instant
1.简介
在之前给大家讲过,计算机中存储的当前时间,其实就是一个不断递增的整数,即从1970年1月1日0分0秒开始以来不断递增的一个整数值。要想获取这个整数值,我们可以使用System.currentTimeMillis()
方法,该方法会返回一个long型的毫秒值,这就是当前时间的时间戳!
现在,我们其实还可以使用Instant.now()
来获取当前的时间戳,效果和System.currentTimeMillis()
类似。但Instant获取的时间戳更为精确,内部采用了两种时间精度,分别是秒和纳秒。
另外Instant还提供了plusXxx
和minusXxx
增减方法,方便我们进行时间的操作。且Instant
作为时间戳对象,我们还可以给它附加上一个时区,创建出对应的ZonedDateTime
对象。也可以给它关联上指定的ZoneId,得到对应的ZonedDateTime
,进而获得对应时区的LocalDateTime
。所以我们可以在LocalDateTime、ZoneId、Instant、ZonedDateTime
之间互相转换。
2.使用方法
接下来我们看看Instant的用法。
import java.time.Instant;import java.time.ZoneId;import java.time.ZonedDateTime;public class Demo22 {public static void main(String[]args) {//获取当前时间的时间戳longcurrentTimeMillis= System.currentTimeMillis();System.out.println("currentTimeMillis毫秒级时间戳="+currentTimeMillis);//获取当前时间的时间戳Instantnow= Instant.now();System.out.println("now时刻="+now);//秒 System.out.println("秒级时间戳="+now.getEpochSecond()); //毫秒 System.out.println("毫秒级时间戳="+now.toEpochMilli());//用指定的时间戳创建Instant对象Instantins= Instant.ofEpochSecond(1676262418);//获取所在时区的ZonedDateTime对象ZonedDateTimezdt=ins.atZone(ZoneId.systemDefault());System.out.println("zdt="+zdt); }}
六.新旧时间API的转换
1.简介
现在我们知道,在Java中,关于日期和时间的API其实有两套,一套旧的,一套新的。这两套API以JDK8为分割线,此前的属于旧版API,此后的属于新版API
●旧版API:定义在java.util包中,主要包括Date、Calendar和TimeZone几个类;
●新版API:JDK8之后引入,定义在java.time包中,主要包括LocalDateTime、ZonedDateTime、ZoneId、DateTimeFormatter、Instant等。
这时有些同学就会好奇,这两套时间API我们在开发时该怎么选择?
1、如果大家的项目属于是一个新开发的项目,且你们的Java版本在JDK8以上,那就采用新版的API吧。
2、但是如果你们的项目涉及到遗留代码,是对旧的项目进行维护或改造,很多遗留代码仍然在使用旧的API,建议大家还是不要改变原有的选择,请继续使用旧版API。
3、但是如果你们的项目环境已经从低版本的JDK切换到了高本版的JDK,且你们公司要求对项目进行升级改造,我们能不能在新旧两种API之间进行转换呢?其实也是可以的,今天就给大家讲一下如何在新旧两套API之间互相转换。
2.旧转新
首先我们来看看旧的API是如何转成新的API的。比如我们想把旧式的Date或Calendar转换为新的API对象,可以通过toInstant()
方法转换为Instant对象,然后再继续转换为ZonedDateTime
,实现代码如下:
import java.time.Instant;import java.time.ZonedDateTime;import java.util.Calendar;import java.util.Date;public class Demo24 {public static void main(String[]args) {//将旧版API中的Date,转为新版API中的Instant对象Instantinstant= new Date().toInstant();System.out.println("instant="+instant);//将旧版API中的Calendar,转为新版API中的Instant,然后再进一步转为新版的ZonedDateTime:Calendarcalendar= Calendar.getInstance();Instantinstant2=calendar.toInstant();ZonedDateTimezdt=instant2.atZone(calendar.getTimeZone().toZoneId());System.out.println("zdt="+zdt); }}
3.新转旧
旧版API可以转换成新版API,同时我们也可以将新班API转成旧版的API,已实现与原有系统的兼容。如果要实现这一目标,我们需要借助long型的时间戳做一个“中转”,具体实现如下:
import java.time.ZonedDateTime;import java.util.Calendar;import java.util.Date;import java.util.TimeZone;public class Demo25 {public static void main(String[]args) {//新版API中的ZonedDateTime,先转为long类型ZonedDateTimezdt= ZonedDateTime.now();//获取秒级时间戳,转为long类型longts=zdt.toEpochSecond() * 1000;System.out.println("ts=" +ts);//然后将long类型,转为旧版API中的DateDatedate= new Date(ts);System.out.println("date=" +date);//将long类型转为旧版API中的Calendar对象Calendarcalendar= Calendar.getInstance();calendar.clear();calendar.setTimeZone(TimeZone.getTimeZone(zdt.getZone().getId()));calendar.setTimeInMillis(zdt.toEpochSecond() * 1000);System.out.println("calendar=" +calendar);}}
七.结语
至此,就把日期的格式化操作给大家讲解完毕了,今天的内容比较多且很实用,最后我们总结一下今日重点
●JDK8中引入了新的日期和时间API,它们是不变类,默认按ISO8601标准格式化和解析;
●使用LocalDateTime可以非常方便地对日期和时间进行加减、调整日期和时间,且总是返回新对象;
●使用isBefore()和isAfter()可以判断日期和时间的先后;
●使用Duration和Period可以表示两个日期和时间的“区间间隔”;
●ZonedDateTime是带时区的日期和时间,可用于时区转换;
●ZonedDateTime和LocalDateTime可以相互转换;
●对ZonedDateTime或LocalDateTime进行格式化,需要使用DateTimeFormatter类;
●DateTimeFormatter可以通过格式化字符串和Locale对日期和时间进行定制输出;
●Instant表示高精度时间戳,它可以和ZonedDateTime以及long互相转换;
●处理日期和时间时,尽量使用新的java.time包;
●新旧两种API之间可以进行转换,旧版转新版可以通过toInstant()方法转换为Instant对象,然后再继续转换为ZonedDateTime;新版转旧版需要借助long型的时间戳做一个“中转”。
以上就是我们本篇内容的详细讲解了~ 大家学会了吗
有技术类问题欢迎大家和我们一起交流讨论,更多技术类干货,关注千锋教育
关键词:
-
【经验分享】最新Microsoft Edge Dev游览器游览Flash网页的办法_今日聚焦
环境:工具:MicrosoftEdgeDev系统版本:Windows10需求描述:描述:需要正常游览Flash页面的所有内容,不能
来源: JDK8 新特性之新的日期&时间API,一篇讲清楚!
智能化生产应用搭建的实战案例 世界微头条
精彩看点:echarts的散点图和中国地图配合使用
【经验分享】最新Microsoft Edge Dev游览器游览Flash网页的办法_今日聚焦
iPhone/iPad全系可用:闪魔MFi苹果认证线21.8元大促 世界简讯
4月轿车销量排名出炉 燃油车新能源“混战” 好戏即将开场
环球时讯:某日系车一把手摊牌了:现在最害怕比亚迪
格局有了!SteamDeck官方庆祝ROG Ally开卖
精彩看点:深圳某公司母亲节放假3天不调休:和妈妈度过完整的母亲节
驾特斯拉遭遇车祸后 林志颖现身珠海首次参加赛车比赛:状态良好
战斗力爆表!无人机航拍时被鹰叼走:画面剧烈晃动
高通骁龙8 Gen2下放!一加Ace2 Pro曝光
曾盛赞比亚迪股票的巴菲特又减持了!本人回应:不想跟马斯克的特斯拉竞争
不止安装失败!Win11 KB5026372更新出现诸多问题 天天观天下
当前短讯!【转】为什么 TCP 建立连接需要三次握手
快看:Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
Java设计模式-适配器模式
“原神玩家”和“塞尔达玩家”打起来了?不过是恶臭互联网的又一次狂欢_世界新消息
别了机械硬盘?全固态玩家转向了当“垃圾佬”
全系2.0T+8AT比BBA香多了!新款林肯冒险家上市:24.58万起
环球即时看!最大96GB内存不是梦!笔记本将迎来单条48GB DDR5内存
7499元 华硕天选4R游戏本上架:锐龙7-7735H、165Hz高刷
取代C++!微软改用Rust语言重写的Win11内核:正式来了
中药成香饽饽! “药茅”片仔癀20年涨价18次 专家称没病别跟风买_全球快资讯
多省加入封杀行列!老头乐销冠雷丁汽车申请破产 创始人被曝身居海外
SSD能有多便宜:2TB新品不到700元!长江存储232层原片颗粒加持
全球微资讯!Windows7 上运行docker实战
4月份以来17家银行下调存款利率 有望助推债市继续走牛 聚焦
美债上限谈判无进展 债务违约风险加大-环球速讯
沙特等减产石油 美国被逼补库存:印度捡漏俄油占大便宜 2022年省下50亿美元
当前资讯!国内第一!深圳要打造5G-A之城 全市5G网速平均必500Mbps 上行下载更狠
焦点热议:1000W用户1Wqps高并发签到系统的架构和实操
学系统集成项目管理工程师(中项)系列21a_整体管理(上)
长沙霸占车位车主致歉 栏杆拆除:双方均再次道歉 从没想会被网暴-环球今亮点
众望所归!马斯克宣布卸任推特CEO:神秘女子将接班
狗狗失踪7年后回家 主人煮饺子庆团圆:网友感慨万物皆有灵
IGN 10分新神作!《塞尔达传说:王国之泪》港服日服已正式解锁
热消息:刘强东真兄弟!20年投入员工福利近500亿、建设公寓2.5万套
【天天播资讯】百度的“New Bing”终于来了!但别高兴得太早
全球看热讯:苹果年度跳水王!M2版Mac mini降到3399元了:不用领券
当前动态:Python学习之二:不同数据库相同表是否相同的比较方法
中芯国际人事再变动 刘训峰担任副董事长:基本年薪334万元 世界信息
性能逼近PS5 ROG掌机正式发布:首发锐龙Z1处理器 畅玩3A大作-天天观速讯
两个妈妈!英国首批三亲婴儿诞生:体内有三个人的DNA
[Linux] 如何查看Centos用户登陆记录?[转载]_全球即时
今日热讯:【财经分析】REITs二级市场止跌回稳 机构看好高速板块后续表现
5月26日上映!迪士尼《小美人鱼》内地版配唱阵容官宣:黄绮珊领衔 短讯
环球今亮点!任天堂《塞尔达传说:王国之泪》获超低评分:太复杂玩不进去
司机400升油箱加到430升仍没加满:费用近3000元 已向多部门举报|看热讯
打开PDB报错ORA-30013
曝APP停摆、发不出工资 爱驰汽车再渡劫-每日短讯
当前快播:兆易创新首发Arm Cortex-M7内核MCU:600MHz超高频率!性能暴涨40%
《塞尔达传说:王国之泪》评分公布!IGN无悬念打出10分满分-新资讯
视点!高叶祝张颂文福如东海寿比南山:晒吃面照庆生
中芯国际发布Q1财报:利润下滑44% 尚未看到市场回暖 焦点日报
S5PV210 | 微处理器启动流程
P3723 [AH2017/HNOI2017]礼物(FFT)
益科正润:美国债务违约倒计时,“去美元化”正当时
【财经分析】土总统埃尔多安寻求连任面临挑战_环球新消息
难怪叶二娘要勾引虚竹的父亲,你看幕后黑手是谁?叶二娘喊他哥哥_前沿资讯
当前热讯:一颗巨型小行星正飞速靠近地球 网友:赶紧来撞我
今天开始 谷歌搜索大变样了:AI接管 焕然一新_环球视讯
同程酒店订单“订后即焚”功能引热议 网友:这是要防谁?
前方畅通日产轩逸频刹车减速 本田飞度看不下去:右侧也要超过去
农村母女嫌路边冷藏车太吵 要求关掉制冷机未果 一砖砸碎车玻璃-当前热文
ChatGPT 再遭禁用 | 人工智能时代下数据安全如何保障
Spring MVC官方文档学习笔记(一)之Web入门
当前报道:python 多进程jieba分词,高效分词,multiprocessing
277米!华为WATCH Ultimate非凡大师助力 潜水员韩颋再创亚洲洞穴潜水记录
不想做“四眼仔”!怎样科学使用电子产品?这4点学起来
环球速看:“男生减速带”视频为什么能爆红?抖音科普
海信手机天猫旗舰店停运:页面显示“店铺终止经营公告”-世界看点
沙特准备进军国际传媒业:钱不是问题要的是影响力
机构调研团走进集泰股份 天天热文
每日热闻!记录--Vue3+TS(uniapp)手撸一个聊天页面
世界时讯:ios打包ipa的四种实用方法(.app转.ipa)
全球热消息:定了!AIRIOT新品发布会,6月6日北京见。
商品日报(5月11日):沪镍跌超5%创逾一个月新低 棕榈油跌超3% 环球新视野
当前速看:六安市裕安区:大抓基层,带动乡村“跑”起来
比三星更稳、比致态便宜!西部数据SN770 2TB固态硬盘只要789元
NVIDIA业绩不给力 黄仁勋年收入锐减!仅员工中位值的94倍 视焦点讯
世界微动态丨LG推出新款超宽带鱼屏:Nano IPS面板 配有雷电4
买菜车也疯狂!丰田卡罗拉Nightshade特别版官图发布:很酷炫
今日热讯:27岁未婚女子入职前被要求做孕检:她当场拒绝了
播报:飘飘遇仙全集狼太郎txt无删减 飘飘遇仙全集狼太郎txt
构建万物互联,华为云IoT+鸿蒙重燃物体感知-全球热点评
JavaScript全解析——this指向|环球今日报
实现高并发秒杀的 7 种方式,写的太好了,建议收藏!!
译:从分布式微服务到单体
谷歌全线反击!PaLM 2部分性能已经超越GPT-4-全球今亮点
【财经分析】两只转债接连进入“下线倒计时” 市场如何接纳退市常态化? 要闻
在街头弹钢琴的他,登上了音乐厅! 热头条
一口一个更好吃:德芙84g袋装小巧粒7.8元/袋大促(原价18元)
环球观焦点:跑步直追!比亚迪高阶智驾第三季度上车:名为DNP、汉将首搭
被指滥用应用市场主导地位:苹果再次遭遇反垄断调查 焦点速看
全球观点:华为WATCH 4星球系列上演宇宙级浪漫 健康领域华为或将迎来重大突破
天舟六号货运飞船与空间站组合体完成交会对接
环球热头条丨用Python实现艺术绘画,人生苦短,代码赛高
【新华500】新华500指数(989001)11日收跌0.18%-世界微动态
世界头条:美联储高利率风险仍存在 黄金期货能否延续涨势