欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

 

源代码地址: