700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java8的LocalDate LocalDateTime和之前的Date Calendar

java8的LocalDate LocalDateTime和之前的Date Calendar

时间:2021-11-01 20:07:54

相关推荐

java8的LocalDate LocalDateTime和之前的Date Calendar

背景

之前研究了一下java里边的Date和Calendar是怎么实现的(《Calendar源码--JDK是怎么计算时间的》),然后发现有文章介绍到java8有LocalDate,然后想着看一下这是什么东西,结果就过了这么久。

前置总结

根据在网上搜到的资料,发现java8的LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Period、Duration等都在java.time包里,Date、Calendar是在java.util包里。

既然以前有了Date、Calendar,为什么还要在java8里新写一份这样的API呢?其实有三个原因(1)线程安全问题,Date、Calendar不是线程安全的(2)易用性和易理解性,Date、Calendar的设计感较弱,易用性差、难理解(深有体会。。。)(3)时区问题,这个其实也可以算是易用性的一个点,Date、Calendar需要考虑时区问题,绕来绕去容易绕晕,有时候对于一个时间其实是无感于时区的。

新的API提供的能力就很好的解决了上面的三个问题,其实java8以后完全可以不用Date、Calendar了。另外,java8的time API和joda-time的使用方法很像,因为是同一个人做的。

代码示例

参考自:/wizardforcel/java8-new-features/148349

基本上自己跑一下示例,就差不多知道该怎么用了

package com.meituan.recommend.biz.guess;import java.time.*;import java.time.chrono.ChronoLocalDateTime;import java.time.chrono.Chronology;import java.time.chrono.HijrahChronology;import java.time.format.DateTimeFormatter;import java.time.temporal.IsoFields;import java.util.Date;public class TimeIntroduction {public static void testClock() throws InterruptedException {//时钟提供给我们用于访问某个特定 时区的 瞬时时间、日期 和 时间的。Clock c1 = Clock.systemUTC(); //系统默认UTC时钟(当前瞬时时间 System.currentTimeMillis())System.out.println(c1.millis()); //每次调用将返回当前瞬时时间(UTC)Clock c2 = Clock.systemDefaultZone(); //系统默认时区时钟(当前瞬时时间)System.out.println(c2.millis()); //每次调用将返回系统默认时区的当前瞬时时间Clock c31 = Clock.system(ZoneId.of("Europe/Paris")); //巴黎时区System.out.println(c31.millis()); //每次调用将返回当前瞬时时间(UTC)Clock c32 = Clock.system(ZoneId.of("Asia/Shanghai"));//上海时区System.out.println(c32.millis());//每次调用将返回当前瞬时时间(UTC)Clock c4 = Clock.fixed(Instant.now(), ZoneId.of("Asia/Shanghai"));//固定上海时区时钟System.out.println(c4.millis());Thread.sleep(1000);System.out.println(c4.millis()); //不变 即时钟时钟在那一个点不动Clock c5 = Clock.offset(c1, Duration.ofSeconds(2)); //相对于系统默认时钟两秒的时钟System.out.println(c1.millis());System.out.println(c5.millis());}public static void testInstant() {//瞬时时间 相当于以前的System.currentTimeMillis()Instant instant1 = Instant.now();System.out.println(instant1.getEpochSecond());//精确到秒 得到相对于1970-01-01 00:00:00 UTC的一个时间System.out.println(instant1.toEpochMilli()); //精确到毫秒Clock clock1 = Clock.systemUTC(); //获取系统UTC默认时钟Instant instant2 = Instant.now(clock1);//得到时钟的瞬时时间System.out.println(instant2.toEpochMilli());Clock clock2 = Clock.fixed(instant1, ZoneId.systemDefault()); //固定瞬时时间时钟Instant instant3 = Instant.now(clock2);//得到时钟的瞬时时间System.out.println(instant3.toEpochMilli());//equals instant1}public static void testLocalDateTime() {//使用默认时区时钟瞬时时间创建 Clock.systemDefaultZone() -->即相对于 ZoneId.systemDefault()默认时区LocalDateTime now = LocalDateTime.now();System.out.println(now);//自定义时区LocalDateTime now2 = LocalDateTime.now(ZoneId.of("Europe/Paris"));System.out.println(now2);//会以相应的时区显示日期//自定义时钟Clock clock = Clock.system(ZoneId.of("Asia/Dhaka"));LocalDateTime now3 = LocalDateTime.now(clock);System.out.println(now3);//会以相应的时区显示日期//不需要写什么相对时间 如java.util.Date 年是相对于1900 月是从0开始//-12-31 23:59LocalDateTime d1 = LocalDateTime.of(, 12, 31, 23, 59);//年月日 时分秒 纳秒LocalDateTime d2 = LocalDateTime.of(, 12, 31, 23, 59, 59, 11);//使用瞬时时间 + 时区Instant instant = Instant.now();LocalDateTime d3 = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());System.out.println(d3);//解析String--->LocalDateTimeLocalDateTime d4 = LocalDateTime.parse("-12-31T23:59");System.out.println(d4);LocalDateTime d5 = LocalDateTime.parse("-12-31T23:59:59.999");//999毫秒 等价于999000000纳秒System.out.println(d5);//使用DateTimeFormatter API 解析 和 格式化DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");LocalDateTime d6 = LocalDateTime.parse("/12/31 23:59:59", formatter);System.out.println(formatter.format(d6));//时间获取System.out.println(d6.getYear());System.out.println(d6.getMonth());System.out.println(d6.getDayOfYear());System.out.println(d6.getDayOfMonth());System.out.println(d6.getDayOfWeek());System.out.println(d6.getHour());System.out.println(d6.getMinute());System.out.println(d6.getSecond());System.out.println(d6.getNano());//时间增减LocalDateTime d7 = d6.minusDays(1);LocalDateTime d8 = d7.plus(1, IsoFields.QUARTER_YEARS);//LocalDate 即年月日 无时分秒//LocalTime即时分秒 无年月日//API和LocalDateTime类似就不演示了}public static void testZonedDateTime() {//即带有时区的date-time 存储纳秒、时区和时差(避免与本地date-time歧义)。//API和LocalDateTime类似,只是多了时差(如-12-20T10:35:50.711+08:00[Asia/Shanghai])ZonedDateTime now = ZonedDateTime.now();System.out.println(now);ZonedDateTime now2 = ZonedDateTime.now(ZoneId.of("Europe/Paris"));System.out.println(now2);//其他的用法也是类似的 就不介绍了ZonedDateTime z1 = ZonedDateTime.parse("-12-31T23:59:59Z[Europe/Paris]");System.out.println(z1);}public static void testDuration() {//表示两个瞬时时间的时间段Duration d1 = Duration.between(Instant.ofEpochMilli(System.currentTimeMillis() - 12323123), Instant.now());//得到相应的时差System.out.println(d1.toDays());System.out.println(d1.toHours());System.out.println(d1.toMinutes());System.out.println(d1.toMillis());System.out.println(d1.toNanos());//1天时差 类似的还有如ofHours()Duration d2 = Duration.ofDays(1);System.out.println(d2.toDays());}public static void testChronology() {//提供对java.util.Calendar的替换,提供对年历系统的支持Chronology c = HijrahChronology.INSTANCE;ChronoLocalDateTime d = c.localDateTime(LocalDateTime.now());System.out.println(d);}/*** 新旧日期转换*/public static void testNewOldDateConversion() {Instant instant = new Date().toInstant();Date date = Date.from(instant);System.out.println(instant);System.out.println(date);}public static void main(String[] args) throws InterruptedException {// testClock();// testInstant();// testLocalDateTime();// testZonedDateTime();// testDuration();// testChronology();testNewOldDateConversion();}}

相关文章

不再细写介绍了,直接引用文章。

对于java8中API的中文介绍,很容易理解,且例子详实:https://lw900925.github.io/java/java8-newtime-api.html

对于java8中时间API的英文介绍,讲解非常顺畅,示例很充分,单词都很简单,可以一看:/java-8-date-time-intro

有时候,我们需要进行LocalDate和Date的互相转换,参考:/p/b4629857fc6f

后续

可以看下源码怎么实现的

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。