深入理解Java8新特性之新日期时间API的应用
程序员文章站
2022-06-25 07:55:30
目录1.新旧对比(线程安全问题)2.localdate3.localtime4.localdatetime5.instant6.duration、period7.testtemporaladjuste...
1.新旧对比(线程安全问题)
我们先来看下面的代码:???????????? (关于代码中某些类中的某些方法,我在这里就不说了,大家可以去查找api文档)
package com.szh.java8.datetime; import java.text.simpledateformat; import java.time.localdate; import java.time.format.datetimeformatter; import java.util.arraylist; import java.util.date; import java.util.list; import java.util.concurrent.*; /** * */ public class testsimpledateformat { public static void main(string[] args) throws executionexception, interruptedexception { simpledateformat sdf = new simpledateformat("yyyymmdd"); callable<date> task1 = new callable<date>() { @override public date call() throws exception { return sdf.parse("20211109"); } }; executorservice pool1 = executors.newfixedthreadpool(10); list<future<date>> futurelist1 = new arraylist<>(); for (int i = 0; i < 10; i++) { futurelist1.add(pool1.submit(task1)); } for (future<date> future : futurelist1) { system.out.println(future.get()); } pool1.shutdown(); //================================================================= // datetimeformatter dtf = datetimeformatter.ofpattern("yyyymmdd"); // // callable<localdate> task2 = new callable<localdate>() { // @override // public localdate call() throws exception { // return localdate.parse("20211109",dtf); // } // }; // // executorservice pool2 = executors.newfixedthreadpool(10); // list<future<localdate>> futurelist2 = new arraylist<>(); // for (int i = 0; i < 10; i++) { // futurelist2.add(pool2.submit(task2)); // } // // for (future<localdate> future : futurelist2) { // system.out.println(future.get()); // } // // pool2.shutdown(); } }
运行之后,就出现了线程安全问题。
将代码中的上半部分注释掉,然后打开下半部分的代码,再次运行,线程安全问题就不存在了。
也就是java8中提供了新一套日期时间api已经解决了线程安全问题。
2.localdate
package com.szh.java8.datetime; import java.time.localdate; /** * */ public class testlocaldate { public static void main(string[] args) { localdate ld1 = localdate.now(); system.out.println(ld1); localdate ld2 = localdate.of(2021,5,1); system.out.println(ld2); localdate ld3 = ld1.plusyears(20); system.out.println(ld3); localdate ld4 = ld1.minusmonths(3); system.out.println(ld4); system.out.println(ld1.isbefore(ld2)); system.out.println(ld2.isafter(ld1)); system.out.println(ld1.isleapyear()); system.out.println("年:" + ld1.getyear() + ", 月:" + ld1.getmonth() + ", 日:" + ld1.getdayofmonth()); system.out.println("年:" + ld1.getyear() + ", 月:" + ld1.getmonthvalue() + ", 日:" + ld1.getdayofmonth()); } }
3.localtime
package com.szh.java8.datetime; import java.time.localtime; /** * */ public class testlocaltime { public static void main(string[] args) { localtime lt1 = localtime.now(); system.out.println(lt1); localtime lt2 = localtime.of(13,14,15); system.out.println(lt2); localtime lt3 = lt2.plushours(3); system.out.println(lt3); localtime lt4 = lt2.minusminutes(14); system.out.println(lt4); system.out.println(lt1.isbefore(lt2)); system.out.println(lt2.isafter(lt1)); system.out.println("小时:" + lt1.gethour() + ", 分钟:" + lt1.getminute() + ", 秒:" + lt1.getsecond()); } }
4.localdatetime
package com.szh.java8.datetime; import java.time.localdatetime; /** * */ public class testlocaldatetime { public static void main(string[] args) { localdatetime ldt1 = localdatetime.now(); system.out.println(ldt1); localdatetime ldt2 = localdatetime.of(2020,5,1,13,14,15); system.out.println(ldt2); localdatetime ldt3 = ldt1.plusyears(15); system.out.println(ldt3); localdatetime ldt4 = ldt1.minusdays(20); system.out.println(ldt4); system.out.println(ldt1.isbefore(ldt2)); system.out.println(ldt2.isafter(ldt1)); system.out.println("年:" + ldt2.getyear() + ", 月:" + ldt2.getmonthvalue() + ", 日:" + ldt2.getdayofmonth() + ", 小时:" + ldt2.gethour() + ", 分钟:" + ldt2.getminute() + ", 秒:" + ldt2.getsecond()); } }
5.instant
package com.szh.java8.datetime; import java.time.instant; import java.time.offsetdatetime; import java.time.zoneoffset; /** * instant : 时间戳(使用 unix 元年 1970年1月1日 00:00:00 所经历的毫秒值) * 默认使用 utc 时区 */ public class testinstant { public static void main(string[] args) { instant instant1 = instant.now(); system.out.println(instant1); offsetdatetime odt = instant1.atoffset(zoneoffset.ofhoursminutesseconds(8,16,32)); system.out.println(odt); system.out.println(instant1.getepochsecond()); system.out.println(instant1.toepochmilli()); instant instant2 = instant.ofepochsecond(1000); system.out.println(instant2); instant instant3 = instant1.plusseconds(30); system.out.println(instant3); instant instant4 = instant1.minusseconds(50); system.out.println(instant4); } }
6.duration、period
package com.szh.java8.datetime; import java.time.duration; import java.time.localdate; import java.time.localtime; import java.time.period; /** * period : 用于计算两个“日期”间隔 * duration : 用于计算两个“时间”间隔 */ public class testperiodduration { public static void main(string[] args) { localdate ld1 = localdate.now(); localdate ld2 = localdate.of(2020,5,1); period period = period.between(ld2,ld1); system.out.println("两个日期相差:" + period.getyears() + "年," + period.getmonths() + "个月," + period.getdays() + "天...."); system.out.println(period.isnegative()); //检查此期间的三个单位是否为负 system.out.println(period.iszero()); //检查此期间的所有三个单位是否为零 system.out.println("--------------------------------------------"); localtime lt1 = localtime.now(); try { thread.sleep(2000); } catch (interruptedexception e) { e.printstacktrace(); } localtime lt2 = localtime.now(); duration duration = duration.between(lt1,lt2); system.out.println("两个时间相差:" + duration.tohours() + "个小时," + duration.tominutes() + "分钟," + duration.getseconds() + "秒...."); system.out.println(duration.isnegative()); //检查此期间的三个单位是否为负 system.out.println(duration.iszero()); //检查此期间的所有三个单位是否为零 } }
7.testtemporaladjuster、testtemporaladjusters
package com.szh.java8.datetime; import java.time.dayofweek; import java.time.localdatetime; import java.time.temporal.temporaladjusters; /** * temporaladjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。 * temporaladjusters : 该类通过静态方法提供了大量的常用 temporaladjuster 的实现。 */ public class testtemporaladjuster { public static void main(string[] args) { localdatetime ldt1 = localdatetime.now(); system.out.println(ldt1); localdatetime ldt2 = ldt1.withmonth(5); system.out.println(ldt2); localdatetime ldt3 = ldt1.with(temporaladjusters.next(dayofweek.saturday)); system.out.println(ldt3); //自定义:下一个工作日 localdatetime ldt4 = ldt1.with((l) -> { localdatetime ldt5 = (localdatetime) l; dayofweek dow = ldt5.getdayofweek(); if (dow.equals(dayofweek.friday)) { return ldt5.plusdays(3); } else if (dow.equals(dayofweek.saturday)) { return ldt5.plusdays(2); } else { return ldt5.plusdays(1); } }); system.out.println(ldt4); } }
8.datetimeformatter
package com.szh.java8.datetime; import java.time.localdatetime; import java.time.format.datetimeformatter; /** * 解析与格式化 */ public class testdatetimeformatter { public static void main(string[] args) { datetimeformatter dtf1 = datetimeformatter.iso_local_date_time; localdatetime ldt1 = localdatetime.now(); string strdate1 = ldt1.format(dtf1); system.out.println(strdate1); system.out.println("-----------------------------------"); datetimeformatter dtf2 = datetimeformatter.ofpattern("yyyy年mm月dd日 hh:mm:ss"); string strdate2 = ldt1.format(dtf2); system.out.println(strdate2); system.out.println("-----------------------------------"); localdatetime newdate = ldt1.parse(strdate2, dtf2); system.out.println(newdate); } }
以上就是深入理解java8新特性之新日期时间api的应用的详细内容,更多关于java 日期时间api的资料请关注其它相关文章!
推荐阅读
-
Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
-
Java8简明学习之新时间日期API
-
Java8新特性时间日期库DateTime API及示例
-
为什么不建议使用Date,而是使用Java8新的时间和日期API?
-
荐 Java语言基础之JDK1.8新特性(Lambda表达式、函数式接口、Stream流、新的日期API)
-
深入理解Java8新特性之Stream API的终止操作步骤
-
Java8新特性之新日期时间库的使用教程
-
深入理解Java8新特性之新日期时间API的应用
-
深入理解Java8新特性之Stream API的创建方式和中间操作步骤
-
深入理解Java8新特性之Optional容器类的应用