当前位置: 移动技术网 > IT编程>开发语言>Java > Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。

Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。

2020年04月23日  | 移动技术网IT编程  | 我要评论

陈改户,香艳迷醉李浩轩,安丘新闻网

  实际使用中,经常需要使用不同精确度的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

 

源代码地址:

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网