Java 对日期,日历及工夫的解决始终以来都饱受诟病,尤其是它决定将 java.util.Date 定义为可批改的以及将 SimpleDateFormat 实现成非线程平安的。看来 Java 曾经意识到须要为工夫及日期性能提供更好的反对了,这对曾经习惯应用 Joda 工夫日期库的社区而言也是件坏事。对于这个新的工夫日期库的最大的长处就在于它定义分明了工夫日期相干的一些概念,比方说,刹时工夫(Instant), 持续时间(duration),日期(date), 工夫(time),时区(time-zone)以及时间段(Period)。同时它也借鉴了 Joda 库的一些长处,比方将人和机器对工夫日期的了解辨别开的。Java 8 依然延用了 ISO 的日历体系,并且与它的前辈们不同,java.time 包中的类是不可变且线程平安的。新的工夫及日期 API 位于 java.time 包中,上面是外面的一些要害的类:
– Instant——它代表的是工夫戳
– LocalDate——不蕴含具体工夫的日期,比方 2014-01-14。它能够用来存储生日,周年纪念日,入职日期等。
– LocalTime——它代表的是不含日期的工夫
– LocalDateTime——它蕴含了日期及工夫,不过还是没有偏移信息或者说时区。
– ZonedDateTime——这是一个蕴含时区的残缺的日期工夫,偏移量是以 UTC/ 格林威治工夫为基准的。
新的库还减少了 ZoneOffset 及 Zoned,能够为时区提供更好的反对。有了新的 DateTimeFormatter 之后日期的解析及格式化也变得面目一新了。轻易提一句,我是在去年这个时候 Java 正要推出这个新性能时写的这篇文章,所以你会发现示例中的工夫都还是去年的。你运行下这些例子,它们返回的值必定都是正确的。
Java 8 是如何解决工夫及日期的
有人问我学习一个新库的最佳路径是什么?我的答复是,就是在理论我的项目中那样去应用它。在一个实在的我的项目中会有各种各样的需要,这会促使开发人员去摸索和钻研这个新库。简言之,只有工作自身才会真正促使你去摸索及学习。java 8 的新的日期及工夫 API 也是一样。为了学习 Java 8 的这个新库,这里我创立了 20 个以工作为导向的例子。咱们先从一个简略的工作开始,比如说如何用 Java 8 的工夫日期库来示意明天,接着再进一步生成一个带工夫及时区的残缺日期,而后再钻研下如何实现一些更理论的工作,比如说开发一个揭示类的利用,来找出间隔一些特定日期比方生日,周日纪念日,下一个帐单日,下一个溢价日或者信用卡过期工夫还有多少天。
示例 1 如何 在 Java 8 中获取当天的日期
Java 8 中有一个叫 LocalDate 的类,它能用来示意明天的日期。这个类与 java.util.Date 略有不同,因为它只蕴含日期,没有工夫。因而,如果你只须要示意日期而不蕴含工夫,就能够应用它。
LocalDate today = LocalDate.now(); System.out.println("Today's Local date : " + today);
Output
Today's Local date : 2014-01-14
你能够看到它创立了明天的日期却不蕴含工夫信息。它还将日期格式化完了再输入进去,不像之前的 Date 类那样,打印进去的数据都是未经格式化的。
示例 2 如何在 Java 8 中获取以后的年月日
LocalDate 类中提供了一些很不便的办法能够用于提取出年月日以及其它的日期属性。应用这些办法,你能够获取到任何你所须要的日期属性,而不再须要应用 java.util.Calendar 这样的类了:
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day);
Output
Today's Local date : 2014-01-14
Year : 2014 Month : 1 day : 14
能够看到,在 Java 8 中获取年月信息非常简单,只需应用对应的 getter 办法就好了,无需记忆,十分直观。你能够拿它和 Java 中老的获取以后年月日的写法进行一下比拟。
示例 3 在 Java 8 中如何获取某个特定的日期
在第一个例子中,咱们看到通过静态方法 now()来生成当天日期是非常简单的,不过通过另一个非常有用的工厂办法 LocalDate.of(),则能够创立出任意一个日期,它承受年月日的参数,而后返回一个等价的 LocalDate 实例。对于这个办法还有一个好消息就是它没有再犯之前 API 中的错,比方说,年只能从 1900 年开始,月必须从 0 开始,等等。这里的日期你写什么就是什么,比如说,上面这个例子中它代表的就是 1 月 14 日,没有什么暗藏逻辑。
LocalDate dateOfBirth = LocalDate.of(2010, 01, 14);
System.out.println("Your Date of birth is :" + dateOfBirth);
Output : Your Date of birth is : 2010-01-14
能够看出,创立进去的日期就是咱们所写的那样,2014 年 1 月 14 日。
示例 4 在 Java 8 中如何查看两个日期是否相等
如果说起事实中理论的解决工夫及日期的工作,有一个常见的就是要查看两个日期是否相等。你可能常常会碰到要判断明天是不是某个非凡的日子,比方生日啊,周年纪念日啊,或者假期之类。有的时候,会给你一个日期,让你查看它是不是某个日子比方说假日。上面这个例子将会帮忙你在 Java 8 中实现这类工作。正如你所想的那样,LocalDate 重写了 equals 办法来进行日期的比拟,如下所示:
LocalDate date1 = LocalDate.of(2014, 01, 14); if(date1.equals(today)){System.out.printf("Today %s and date1 %s are same date %n", today, date1);
}
Output
today 2014-01-14 and date1 2014-01-14 are same date
在本例中咱们比拟的两个日期是相等的。同时,如果在代码中你拿到了一个格式化好的日期串,你得先将它解析成日期而后能力比拟。你能够将这个例子与 Java 之前比拟日期的形式进行下比拟,你会发现它真是爽多了。
示例 5 在 Java 8 中如何查看反复事件,比如说生日
在 Java 中还有一个与工夫日期相干的理论工作就是查看反复事件,比如说每月的帐单日,结婚纪念日,每月还款日或者是每年交保险费的日子。如果你在一家电商公司工作的话,那么必定会有这么一个模块,会去给用户发送生日祝愿并且在每一个重要的假日给他们捎去问候,比如说圣诞节,感恩节,在印度则可能是万灯节(Deepawali)。如何在 Java 中判断是否是某个节日或者反复事件?应用 MonthDay 类。这个类由月日组合,不蕴含年信息,也就是说你能够用它来代表每年反复呈现的一些日子。当然也有一些别的组合,比如说 YearMonth 类。它和新的工夫日期库中的其它类一样也都是不可变且线程平安的,并且它还是一个值类(value class)。咱们通过一个例子来看下如何应用 MonthDay 来查看某个反复的日期:
LocalDate dateOfBirth = LocalDate.of(2010, 01, 14);
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(today);
if(currentMonthDay.equals(birthday)){System.out.println("Many Many happy returns of the day !!");
}else{System.out.println("Sorry, today is not your birthday");
}
Output: Many Many happy returns of the day !!
尽管年不同,但明天就是生日的那天,所以在输入那里你会看到一条生日祝愿。你能够调整下零碎的工夫再运行下这个程序看看它是否能揭示你下一个生日是什么时候,你还能够试着用你的下一个生日来编写一个 JUnit 单元测试看看代码是否正确运行。
示例 6 如何在 Java 8 中获取以后工夫
这与第一个例子中获取以后日期十分类似。这次咱们用的是一个叫 LocalTime 的类,它是没有日期的工夫,与 LocalDate 是远亲。这里你也能够用动态工厂办法 now()来获取以后工夫。默认的格局是 hh:mm:ss:nnn,这里的 nnn 是纳秒。能够和 Java 8 以前如何获取以后工夫做一下比拟。
LocalTime time = LocalTime.now(); System.out.println("local time now :" + time);
Output
local time now : 16:33:33.369 // in hour, minutes, seconds, nano seconds
能够看到,以后工夫是不蕴含日期的,因为 LocalTime 只有工夫,没有日期。
示例 7 如何减少工夫外面的小时数
很多时候咱们须要减少小时,分或者秒来计算出未来的工夫。Java 8 不仅提供了不可变且线程平安的类,它还提供了一些更不便的办法譬如 plusHours()来替换原来的 add()办法。顺便说一下,这些办法返回的是一个新的 LocalTime 实例的援用,因为 LocalTime 是不可变的,可别忘了存储好这个新的援用。
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // adding two hours
System.out.println("Time after 2 hours :" + newTime);
Output :
Time after 2 hours : 18:33:33.369
能够看到以后工夫 2 小时后是 16:33:33.369。当初你能够将它和 Java 中减少或者缩小小时的老的形式进行下比拟。一看便知哪种形式更好。
示例 8 如何获取 1 周后的日期
这与前一个获取 2 小时后的工夫的例子相似,这里咱们将学会如何获取到 1 周后的日期。LocalDate 是用来示意无工夫的日期的,它有一个 plus()办法能够用来减少日,星期,或者月,ChronoUnit 则用来示意这个工夫单位。因为 LocalDate 也是不可变的,因而任何批改操作都会返回一个新的实例,因而别忘了保存起来。
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("Today is :" + today);
System.out.println("Date after 1 week :" + nextWeek);
Output:
Today is : 2014-01-14
Date after 1 week : 2014-01-21
能够看到 7 天也就是一周后的日期是什么。你能够用这个办法来减少一个月,一年,一小时,一分钟,甚至是十年,查看下 Java API 中的 ChronoUnit 类来获取更多选项。
示例 9 一年前后的日期
这是上个例子的续集。上例中,咱们学习了如何应用 LocalDate 的 plus()办法来给日期减少日,周或者月,当初咱们来学习下如何用 minus()办法来找出一年前的那天。
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
System.out.println("Date before 1 year :" + previousYear);
LocalDate nextYear = today.plus(1, YEARS);
System.out.println("Date after 1 year :" + nextYear);
Output:
Date before 1 year : 2013-01-14
Date after 1 year : 2015-01-14
能够看到当初一共有两年,一个是 2013 年,一个是 2015 年,别离是 2014 的前后那年。
示例 10 在 Java 8 中应用时钟
Java 8 中自带了一个 Clock 类,你能够用它来获取某个时区下以后的刹时工夫,日期或者工夫。能够用 Clock 来代替 System.currentTimeInMillis() 与 TimeZone.getDefault()办法。
// Returns the current time based on your system clock and set to UTC.
Clock clock = Clock.systemUTC();
System.out.println("Clock :" + clock);
// Returns time based on system clock zone Clock defaultClock =
Clock.systemDefaultZone();
System.out.println("Clock :" + clock);
Output:
Clock : SystemClock[Z]
Clock : SystemClock[Z]
你能够用指定的日期来和这个时钟进行比拟,比方上面这样:
public class MyClass {
private Clock clock; // dependency inject ...
public void process(LocalDate eventDate) {if(eventDate.isBefore(LocalDate.now(clock)) {...}
}
}
如果你须要对不同时区的日期进行解决的话这是相当不便的。
示例 11 在 Java 中如何判断某个日期是在另一个日期的后面还是前面
这也是理论我的项目中常见的一个工作。你怎么判断某个日期是在另一个日期的后面还是前面,或者正好相等呢?在 Java 8 中,LocalDate 类有一个 isBefore()和 isAfter()办法能够用来比拟两个日期。如果调用办法的那个日期比给定的日期要早的话,isBefore()办法会返回 true。
LocalDate tomorrow = LocalDate.of(2014, 1, 15);、if(tommorow.isAfter(today)){System.out.println("Tomorrow comes after today");
}
LocalDate yesterday = today.minus(1, DAYS);
if(yesterday.isBefore(today)){System.out.println("Yesterday is day before today");
}
Output:
Tomorrow comes after today
Yesterday is day before today
能够看到在 Java 8 中进行日期比拟非常简单。不须要再用像 Calendar 这样的另一个类来实现相似的工作了。
示例 12 在 Java 8 中解决不同的时区
Java 8 不仅将日期和工夫进行了拆散,同时还有时区。当初曾经有好几组与时区相干的类了,比方 ZonId 代表的是某个特定的时区,而 ZonedDateTime 代表的是带时区的工夫。它等同于 Java 8 以前的 GregorianCalendar 类。应用这个类,你能够将本地工夫转换成另一个时区中的对应工夫,比方上面这个例子:
// Date and time with timezone in Java 8 ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america);
System.out.println("Current date and time in a particular timezone :" + dateAndTimeInNewYork);
Output :
Current date and time in a particular timezone : 2014-01-14T16:33:33.373-05:00[America/New_York]
能够拿它跟之前将本地工夫转换成 GMT 工夫的形式进行下比拟。顺便说一下,正如 Java 8 以前那样,对应时区的那个文本可别弄错了,否则你会碰到这么一个异样:
Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: ASIA/Tokyo
at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
at java.time.ZoneRegion.ofId(ZoneRegion.java:120)
at java.time.ZoneId.of(ZoneId.java:403)
at java.time.ZoneId.of(ZoneId.java:351)
示例 13 如何示意固定的日期,比方信用卡过期工夫
正如 MonthDay 示意的是某个反复呈现的日子的,YearMonth 又是另一个组合,它代表的是像信用卡还款日,定期存款到期日,options 到期日这类的日期。你能够用这个类来找出那个月有多少天,lengthOfMonth()这个办法返回的是这个 YearMonth 实例有多少天,这对于查看 2 月到底是 28 天还是 29 天可是十分有用的。
YearMonth currentYearMonth = YearMonth.now(); System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY);
System.out.printf("Your credit card expires on %s %n", creditCardExpiry);
Output:
Days in month year 2014-01: 31
Your credit card expires on 2018-02
示例 14 如何在 Java 8 中查看平年
这并没什么简单的,LocalDate 类有一个 isLeapYear()的办法可能返回以后 LocalDate 对应的那年是否是平年。如果你还想反复造轮子的话,能够看下这段代码,这是纯用 Java 编写的判断某年是否是平年的逻辑。
if(today.isLeapYear()){System.out.println("This year is Leap year");
}else {System.out.println("2014 is not a Leap year");
}
Output: 2014 is not a Leap year
你能够多查看几年看看后果是否正确,最好写一个单元测试来对失常年份和平年进行下测试。
示例 15 两个日期之间蕴含多少天,多少个月
还有一个常见的工作就是计算两个给定的日期之间蕴含多少天,多少周或者多少年。你能够用 java.time.Period 类来实现这个性能。在上面这个例子中,咱们将计算以后日期与未来的一个日期之前一共隔着几个月。
LocalDate java8Release = LocalDate.of(2014, Month.MARCH, 14);
Period periodToNextJavaRelease =
Period.between(today, java8Release);
System.out.println("Months left between today and Java 8 release :" + periodToNextJavaRelease.getMonths() );
Output:
Months left between today and Java 8 release : 2
能够看到,本月是 1 月,而 Java 8 的公布日期是 3 月,因而中距离着 2 个月。
示例 16 带时区偏移量的日期与工夫
在 Java 8 外面,你能够用 ZoneOffset 类来代表某个时区,比方印度是 GMT 或者 UTC5:30,你能够应用它的静态方法 ZoneOffset.of()办法来获取对应的时区。只有获取到了这个偏移量,你就能够拿 LocalDateTime 和这个偏移量创立出一个 OffsetDateTime。
LocalDateTime datetime = LocalDateTime.of(2014, Month.JANUARY, 14, 19, 30);
ZoneOffset offset = ZoneOffset.of("+05:30");
OffsetDateTime date = OffsetDateTime.of(datetime, offset);
System.out.println("Date and Time with timezone offset in Java :" + date);
Output :
Date and Time with timezone offset in Java : 2014-01-14T19:30+05:30
能够看到当初工夫日期与时区是关联上了。还有一点就是,OffSetDateTime 次要是给机器来了解的,如果是给人看的,能够应用 ZoneDateTime 类。
示例 17 在 Java 8 中如何获取以后工夫戳
如果你还记得在 Java 8 前是如何获取以后工夫戳的,那当初这几乎就是小菜一碟了。Instant 类有一个动态的工厂办法 now()能够返回以后工夫戳,如下:
Instant timestamp = Instant.now();
System.out.println("What is value of this instant" + timestamp);
Output :
What is value of this instant 2014-01-14T08:33:33.379Z
能够看出,以后工夫戳是蕴含日期与工夫的,与 java.util.Date 很相似,事实上 Instant 就是 Java 8 前的 Date,你能够应用这两个类中的办法来在这两个类型之间进行转换,比方 Date.from(Instant)是用来将 Instant 转换成 java.util.Date 的,而 Date.toInstant()是将 Date 转换成 Instant 的。
示例 18 如何在 Java 8 中应用预约义的格局器来对日期进行解析 / 格式化
在 Java 8 之前,工夫日期的格式化可是个技术活,咱们的好搭档 SimpleDateFormat 并不是线程平安的,而如果用作本地变量来格式化的话又显得有些轻便。多亏了线程本地变量,这使得它在多线程环境下也算有了用武之地,但 Java 维持这一状态也有很长一段时间了。这次它引入了一个全新的线程平安的日期与工夫格局器。它还自带了一些预约义好的格局器,蕴含了罕用的日期格局。比如说,本例 中咱们就用了预约义的 BASIC_ISO_DATE 格局,它会将 2014 年 2 月 14 日格式化成 20140114。
String dayAfterTommorrow = "20140116";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
DateTimeFormatter.BASIC_ISO_DATE);
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);
Output :
Date generated from String 20140116 is 2014-01-16
你能够看到生成的日期与指定字符串的值是匹配的,就是日期格局上略有不同。
示例 19 如何在 Java 中应用自定义的格局器来解析日期
在上例中,咱们应用了内建的工夫日期格局器来解析日期字符串。当然了,预约义的格局器确实不错但有时候你可能还是须要应用自定义的日期格局,这个时候你就得本人去创立一个自定义的日期格局器实例了。上面这个例子中的日期格局是”MMM dd yyyy”。你能够给 DateTimeFormatter 的 ofPattern 静态方法 () 传入任何的模式,它会返回一个实例,这个模式的字面量与前例中是雷同的。比如说 M 还是代表月,而 m 仍是分。有效的模式会抛出 DateTimeParseException 异样,但如果是逻辑上的谬误比如说该用 M 的时候用成 m,这样就没方法了。
String goodFriday = "Apr 18 2014";
try {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy");
LocalDate holiday = LocalDate.parse(goodFriday, formatter);
System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday);
} catch (DateTimeParseException ex) {System.out.printf("%s is not parsable!%n", goodFriday);
ex.printStackTrace();}
Output :
Successfully parsed String Apr 18 2014, date is 2014-04-18
能够看到日期的值与传入的字符串确实是相符的,只是格局不同。
示例 20 如何在 Java 8 中对日期进行格式化,转换成字符串
在上两个例子中,只管咱们用到了 DateTimeFormatter 类但咱们次要是进行日期字符串的解析。在这个例子中咱们要做的事件正好相同。这里咱们有一个 LocalDateTime 类的实例,咱们要将它转换成一个格式化好的日期串。这是目前为止 Java 中将日期转换成字符串最简略便捷的形式了。上面这个例子将会返回一个格式化好的字符串。与前例雷同的是,咱们仍需应用指定的模式串去创立一个 DateTimeFormatter 类的实例,但调用的并不是 LocalDate 类的 parse 办法,而是它的 format()办法。这个办法会返回一个代表以后日期的字符串,对应的模式就是传入的 DateTimeFormatter 实例中所定义好的。
LocalDateTime arrivalDate = LocalDateTime.now();
try {DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a");
String landing = arrivalDate.format(format);
System.out.printf("Arriving at : %s %n", landing);
} catch (DateTimeException ex) {System.out.printf("%s can't be formatted!%n", arrivalDate);
ex.printStackTrace();}
Output : Arriving at : Jan 14 2014 04:33 PM
能够看到,以后工夫是用给定的”MMM dd yyyy hh:mm a”模式来示意的,它蕴含了三个字母示意的月份以及用 AM 及 PM 来示意的工夫。
Java 8 中日期与工夫 API 的几个关键点
看完了这些例子后,我置信你曾经对 Java 8 这套新的工夫日期 API 有了肯定的理解了。当初咱们来回顾下对于这个新的 API 的一些要害的因素。
- 它提供了 javax.time.ZoneId 用来解决时区。
- 它提供了 LocalDate 与 LocalTime 类
- Java 8 中新的工夫与日期 API 中的所有类都是不可变且线程平安的,这与之前的 Date 与 Calendar API 中的恰好相反,那外面像 java.util.Date 以及 SimpleDateFormat 这些要害的类都不是线程平安的。
- 新的工夫与日期 API 中很重要的一点是它定义分明了根本的工夫与日期的概念,比方说,刹时工夫,持续时间,日期,工夫,时区以及时间段。它们都是基于 ISO 日历体系的。
- 每个 Java 开发人员都应该至多理解这套新的 API 中的这五个类:
– Instant 它代表的是工夫戳,比方 2014-01-14T02:20:13.592Z,这能够从 java.time.Clock 类中获取,像这样:
Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();
– LocalDate 它示意的是不带工夫的日期,比方 2014-01-14。它能够用来存储生日,周年纪念日,入职日期等。
– LocalTime – 它示意的是不带日期的工夫
– LocalDateTime – 它蕴含了工夫与日期,不过没有带时区的偏移量
– ZonedDateTime – 这是一个带时区的残缺工夫,它依据 UTC/ 格林威治工夫来进行时区调整
- 这个库的主包是 java.time,外面蕴含了代表日期,工夫,刹时以及持续时间的类。它有两个子 package,一个是 java.time.foramt,这个是什么用处就很显著了,还有一个是 java.time.temporal,它能从更低层面对各个字段进行拜访。
- 时区指的是地球上共享同一规范工夫的地区。每个时区都有一个惟一标识符,同时还有一个地区 / 城市 (Asia/Tokyo) 的格局以及从格林威治工夫开始的一个偏移工夫。比如说,东京的偏移工夫就是 +09:00。
- OffsetDateTime 类实际上蕴含了 LocalDateTime 与 ZoneOffset。它用来示意一个蕴含格林威治工夫偏移量(+/- 小时:分,比方 +06:00 或者 -08:00)的残缺的日期(年月日)及工夫(时分秒,纳秒)。
- DateTimeFormatter 类用于在 Java 中进行日期的格式化与解析。与 SimpleDateFormat 不同,它是不可变且线程平安的,如果需要的话,能够赋值给一个动态变量。DateTimeFormatter 类提供了许多预约义的格局器,你也能够自定义本人想要的格局。当然了,依据约定,它还有一个 parse()办法是用于将字符串转换成日期的,如果转换期间呈现任何谬误,它会抛出 DateTimeParseException 异样。相似的,DateFormatter 类也有一个用于格式化日期的 format()办法,它出错的话则会抛出 DateTimeException 异样。
- 再说一句,“MMM d yyyy”与“MMm dd yyyy”这两个日期格局也略有不同,前者能辨认出”Jan 2 2014″与”Jan 14 2014″这两个串,而后者如果传进来的是”Jan 2 2014″则会报错,因为它冀望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的状况下,你得在后面补 0,比方”Jan 2 2014″应该改为”Jan 02 2014″。
对于 Java 8 这个新的工夫日期 API 就讲到这了。这几个简短的示例 对于了解这套新的 API 中的一些新增类曾经足够了。因为它是基于理论工作来解说的,因而前面再遇到 Java 中要对工夫与日期进行解决的工作时,就不必再四处寻找了。咱们学习了如何创立与批改日期实例。咱们还理解了纯日期,日期加工夫,日期加时区的区别,晓得如何比拟两个日期,如何找到某天到指定日期比如说下一个生日,周年纪念日或者保险日还有多少天。咱们还学习了如何在 Java 8 中用线程平安的形式对日期进行解析及格式化,而无需再应用线程本地变量或者第三方库这种取巧的形式。新的 API 能胜任任何与工夫日期相干的工作。
最初
想要学习 java 的同学私信回复 材料
支付一线大厂 Java 面试题总结 + 阿里巴巴泰山手册 + 各知识点学习思维导 + 一份 300 页 pdf 文档的 Java 外围知识点总结!
这些材料的内容都是面试时面试官必问的知识点,篇章包含了很多知识点,其中包含了有基础知识、Java 汇合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等等。