Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
程序员文章站
2022-05-10 13:10:06
实际使用中,经常需要使用不同精确度的Date,比如保留到天 2020-04-23 00:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyy-MM-dd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Forma... ......
实际使用中,经常需要使用不同精确度的date,比如保留到天 2020-04-23 00:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyy-mm-dd),然后再解析为date。java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用format方法、 使用of方法和使用with方法,性能对比,使用of方法性能最优。
1.减少时间精确度的三种方法和性能比较
这里使用localdatetime 保留到(yyyy-mm-dd)天做为实例对比。
1.1 使用format方法减少精度到天,先格式化,再解析
localdatetime ldt = localdatetime.now(); localdatetime ldt2 = datetimeformatterutil.parsedatestrtolocaldatetime(datetimeformatterutil.formattodatestr(ldt)); system.out.println("reduceaccuracyformat result:"+ldt2);
输出:
reduceaccuracyformat result:2020-04-23t00:00
1.2 使用of方法减少精度到天
localdatetime ldt = localdatetime.now(); localdatetime ldt2 = localdatetime.of(ldt.getyear(), ldt.getmonth().getvalue(), ldt.getdayofmonth(), 0, 0); system.out.println("reduceaccuracyof result:"+ldt2);
输出:
reduceaccuracyof result:2020-04-23t00:00
1.3 使用with方法减少精度到天
localdatetime ldt = localdatetime.now(); localdatetime ldt2 = ldt.withhour(0).withminute(0).withsecond(0).withnano(0); system.out.println("reduceaccuracyof result:"+ldt2);
输出:
reduceaccuracywith result:2020-04-23t00:00
1.4 3种方法性能比较
package com.xkzhangsan.time.test; import java.time.localdatetime; import org.junit.test; import com.xkzhangsan.time.formatter.datetimeformatterutil; /** * 日期计算,性能测试类 * @classname: calculatorperformancetest * @description: calculatorperformancetest * @author xkzhangsan * @date 2020年4月22日 */ public class calculatorperformancetest { /** * 使用format方法减少精度到天 */ @test public void reduceaccuracyformat(){ localdatetime ldt = localdatetime.now(); localdatetime ldt2 = null; long s = system.currenttimemillis(); for (int i = 0; i < 100000; i++) { ldt2 = datetimeformatterutil.parsedatestrtolocaldatetime(datetimeformatterutil.formattodatestr(ldt)); } system.out.println("reduceaccuracyformat cost:"+(system.currenttimemillis()-s)); system.out.println("reduceaccuracyformat result:"+ldt2); } /** * 使用of方法减少精度到天 */ @test public void reduceaccuracyof(){ localdatetime ldt = localdatetime.now(); localdatetime ldt2 = null; long s = system.currenttimemillis(); for (int i = 0; i < 100000; i++) { ldt2 = localdatetime.of(ldt.getyear(), ldt.getmonth().getvalue(), ldt.getdayofmonth(), 0, 0); } system.out.println("reduceaccuracyof cost:"+(system.currenttimemillis()-s)); system.out.println("reduceaccuracyof result:"+ldt2); } /** * 使用with方法减少精度到天 */ @test public void reduceaccuracywith(){ localdatetime ldt = localdatetime.now(); localdatetime ldt2 = null; long s = system.currenttimemillis(); for (int i = 0; i < 100000; i++) { ldt2 = ldt.withhour(0).withminute(0).withsecond(0).withnano(0); } system.out.println("reduceaccuracywith cost:"+(system.currenttimemillis()-s)); system.out.println("reduceaccuracywith result:"+ldt2); } }
输出:
reduceaccuracyformat cost:333 reduceaccuracyformat result:2020-04-23t00:00 reduceaccuracyof cost:19 reduceaccuracyof result:2020-04-23t00:00 reduceaccuracywith cost:24 reduceaccuracywith result:2020-04-23t00:00
通过同样运行100000次,对比可以看出,使用of方法性能最好,使用with方法其次,和of方法相差不多,但每次调用with会生成一个日期对象,使用format方法性能最差,和of方法相差17倍左右。
2 xk-time中的应用
xk-time中使用of方法减少时间精确度,然后转换为需要的类型如date。
2.1 代码
/** * 减少时间精度到秒,其他补0,返回如,2020-04-23 15:18:13 * @param localdatetime * @return */ public static localdatetime reduceaccuracytosecond(localdatetime localdatetime) { objects.requirenonnull(localdatetime, "localdatetime"); return localdatetime.of(localdatetime.getyear(), localdatetime.getmonthvalue(), localdatetime.getdayofmonth(), localdatetime.gethour(), localdatetime.getminute(), localdatetime.getsecond()); } /** * 减少时间精度到秒,其他补0,返回如,2020-04-23 15:18:13 * @param date * @return */ public static date reduceaccuracytosecond(date date) { objects.requirenonnull(date, "date"); return datetimeconverterutil.todate(reduceaccuracytosecond(datetimeconverterutil.tolocaldatetime(date))); } /** * 减少时间精度到分,其他补0,返回如,2020-04-23 15:18:00 * @param localdatetime * @return */ public static localdatetime reduceaccuracytominute(localdatetime localdatetime) { objects.requirenonnull(localdatetime, "localdatetime"); return localdatetime.of(localdatetime.getyear(), localdatetime.getmonthvalue(), localdatetime.getdayofmonth(), localdatetime.gethour(), localdatetime.getminute(), 0); } /** * 减少时间精度到分,其他补0,返回如,2020-04-23 15:18:00 * @param date * @return */ public static date reduceaccuracytominute(date date) { objects.requirenonnull(date, "date"); return datetimeconverterutil.todate(reduceaccuracytominute(datetimeconverterutil.tolocaldatetime(date))); } /** * 减少时间精度到小时,其他补0,返回如,2020-04-23 15:00:00 * @param localdatetime * @return */ public static localdatetime reduceaccuracytohour(localdatetime localdatetime) { objects.requirenonnull(localdatetime, "localdatetime"); return localdatetime.of(localdatetime.getyear(), localdatetime.getmonthvalue(), localdatetime.getdayofmonth(), localdatetime.gethour(), 0, 0); } /** * 减少时间精度到小时,其他补0,返回如,2020-04-23 15:00:00 * @param date * @return */ public static date reduceaccuracytohour(date date) { objects.requirenonnull(date, "date"); return datetimeconverterutil.todate(reduceaccuracytohour(datetimeconverterutil.tolocaldatetime(date))); } /** * 减少时间精度到天,其他补0,返回如,2020-04-23 00:00:00 * @param localdatetime * @return */ public static localdatetime reduceaccuracytoday(localdatetime localdatetime) { objects.requirenonnull(localdatetime, "localdatetime"); return localdatetime.of(localdatetime.getyear(), localdatetime.getmonthvalue(), localdatetime.getdayofmonth(), 0, 0, 0); } /** * 减少时间精度到天,其他补0,返回如,2020-04-23 00:00:00 * @param date * @return */ public static date reduceaccuracytoday(date date) { objects.requirenonnull(date, "date"); return datetimeconverterutil.todate(reduceaccuracytoday(datetimeconverterutil.tolocaldatetime(date))); }
2.2 测试代码
/** * date 减少精度测试 */ @test public void reduceaccuracydatetest(){ date date = new date(); system.out.println(datetimeformatterutil.formattodatetimestr(date)); system.out.println(datetimeformatterutil.formattodatetimestr(datetimecalculatorutil.reduceaccuracytosecond(date))); system.out.println(datetimeformatterutil.formattodatetimestr(datetimecalculatorutil.reduceaccuracytominute(date))); system.out.println(datetimeformatterutil.formattodatetimestr(datetimecalculatorutil.reduceaccuracytohour(date))); system.out.println(datetimeformatterutil.formattodatetimestr(datetimecalculatorutil.reduceaccuracytoday(date))); } /** * localdatetime 减少精度测试 */ @test public void reduceaccuracylocaldatetimetest(){ localdatetime ldt = localdatetime.now(); system.out.println(ldt); system.out.println(datetimecalculatorutil.reduceaccuracytosecond(ldt)); system.out.println(datetimecalculatorutil.reduceaccuracytominute(ldt)); system.out.println(datetimecalculatorutil.reduceaccuracytohour(ldt)); system.out.println(datetimecalculatorutil.reduceaccuracytoday(ldt)); }
输出:
2020-04-23 16:04:39 2020-04-23 16:04:39 2020-04-23 16:04:00 2020-04-23 16:00:00 2020-04-23 00:00:00 2020-04-23t16:05:10.233 2020-04-23t16:05:10 2020-04-23t16:05 2020-04-23t16:00 2020-04-23t00:00
源代码地址:
推荐阅读
-
Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
-
Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
-
Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
-
Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
-
Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。