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

源代码地址:https://github.com/xkzhangsan/xk-time

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

  1. 在swt中获取jar包中的文件 uri is not hierarchical

    uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...

  2. API接口自动化之3 同一个war包中多个接口做自动化测试

    同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...

  3. Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包

    最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的:   很明显建立项目后的架构是上 ...

  4. Mac 如何导出ipa文件中Assets.car包中的切图

    在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...

  5. 【转】Eclipse中查看jar包中的源码

    (简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...

  6. JDK中的Atomic包中的类及使用

    引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...

  7. Package.json中dependencies依赖包中^符号和~符号前缀的区别

    刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...

  8. Java8系列 (六) 新的日期和时间API

    概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...

  9. Java8 新的日期和时间API(笔记)

    LocalDate LocalTime Instant duration以及Period 使用LocalDate和LocalTime //2017-03-20 LocalDate date = Loc ...

随机推荐

  1. MATLAB 颜色图函数(imagesc/scatter/polarPcolor/pcolor)

    2维的热度图 imagesc imagesc(x, y, z),x和y分别是横纵坐标,z为值,表示颜色 imagesc(theta,phi,slc); colorbar xlabel(); ylabe ...

  2. OSPF与ACL的综合应用

    在企业中OSPF和ACL应用特别广泛,本实验介绍OSPF和ACL具体配置过程 实验拓扑: 实验要求: 1.企业内网运行OSPF路由协议,区域规划如图所示:2.财务和研发所在的区域不受其他区域链路不稳定 ...

  3. Linux - 文件的三种时间之atime、ctime、mtime的区别和简单用法

    在Linux中,文件或者目录中有三个时间属性 atime ctime mtime 简名 全名 中文 作用 atime Access Time 访问时间 最后一次访问文件(读取或执行)的时间 ctime ...

  4. 为何给CheckBox设置了checked属性还是没有勾选,行内样式都显示了checked

    为何给CheckBox设置了checked属性还是没有勾选,行内样式都显示了checked 正常情况下我们设置给CheckBox一个checked属性后一般都会选中 然而我今天在做案例的时候却遇到了类 ...

  5. 15.自动部署web工程

    用maven自动部署web工程 在pom.xml中写入以下: <build> <!--最终名称,进入网页时有http://localhost:8080/xxx/--> < ...

  6. Ubuntu下已安装Anaconda但出现conda: command not found错误解决办法

    原因:环境未配置 执行[vim ~/.bashrc]命令,进入配置文件,在最后一行按'o'插入一行,并添加语句: export PATH=/home/duanyongchun/anaconda3/bi ...

  7. Django之环境安装

    什么是Django Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由 ...

  8. Cows POJ - 2481 (树状数组 + 单点更新 + 区间查询)

    Cows 思路:我们可以按照每个范围的S从小到大排序,相同的S按E从大到小排序,这样的好处是当前范围的S一定大于等于之前范围的S(即当前的范围可能被之前范围的包围),那么我们只需要统计之前的范围E比当 ...

  9. E - River Hopscotch POJ - 3258(二分)

    E - River Hopscotch POJ - 3258 Every year the cows hold an event featuring a peculiar version of hop ...

  10. MapReduce( map的使用)

    MapReduce Description MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Red ...