Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
实际使用中,经常需要使用不同精确度的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类,减少时间精度方法性能比较和使用。的更多相关文章
- 在swt中获取jar包中的文件 uri is not hierarchical
uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...
- API接口自动化之3 同一个war包中多个接口做自动化测试
同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...
- Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包
最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的: 很明显建立项目后的架构是上 ...
- Mac 如何导出ipa文件中Assets.car包中的切图
在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...
- 【转】Eclipse中查看jar包中的源码
(简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...
- JDK中的Atomic包中的类及使用
引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...
- Package.json中dependencies依赖包中^符号和~符号前缀的区别
刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...
- Java8系列 (六) 新的日期和时间API
概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...
- Java8 新的日期和时间API(笔记)
LocalDate LocalTime Instant duration以及Period 使用LocalDate和LocalTime //2017-03-20 LocalDate date = Loc ...
随机推荐
- 李宏毅老师机器学习课程笔记_ML Lecture 3-1: Gradient Descent
引言: 这个系列的笔记是台大李宏毅老师机器学习的课程笔记 视频链接(bilibili):李宏毅机器学习(2017) 另外已经有有心的同学做了速记并更新在github上:李宏毅机器学习笔记(LeeML- ...
- Spss统计描述分析
总觉得有些技能学会了是不会忘的,但是还是要记录一下,怕记忆力不像狗皮膏药,并不那么牢固. 1.文件的合并 两个数据文件的合并 点击添加个案,这一步按照自己的需求选择,也可以打开外部数据集,在这里打开的 ...
- TensorFlow v2.0实现Word2Vec算法
使用TensorFlow v2.0实现Word2Vec算法计算单词的向量表示,这个例子是使用一小部分维基百科文章来训练的. 更多信息请查看论文: Mikolov, Tomas et al. " ...
- ConcurrentHashMap(1.7版本和1.8版本)
为什么要使用ConcurrentHashMap? ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代hashMap和HashTable.因为在并发编程中使 ...
- 阿里云ECS(Ubuntu)单节点Kubernetes部署
参考资料: kubernetes官网英文版 kubernetes官网中文版 前言 这篇文章是比较久之前写的了,无聊翻了下博客发现好几篇博文排版莫名其妙的变了... 于是修改并完善了下.当初刚玩k8s的 ...
- JSP学习笔记(二)
JSP内置对象 request对象 response对象 session对象 application对象 out对象 有些对象不用声明就可以在JSP页面的Java程序片和表达式部分使用,这就是JSP的 ...
- java web综合案例
1.采用的技术: bootstrap+jsp+servlet+三层架构(servlet,service,dao)+mysql 注意:mysql使用的是5.5版本,使用高版本会有很多问题.可以将5.5版 ...
- Javascript-什么是递归?
递归? 程序调用自身的编程技巧就称之为递归(recursion),就是再运行的过程中调用自己,本质上就是循环. 构成递归的条件有: Ⅰ.不能无限制的调用本身,必须有一个出口,化为简单的状况处理(非递归 ...
- 【Java技术系列】爱情36技之记忆永存
1. 关注“一猿小讲”的伙伴们都清楚,Java 那小子带着心爱的 Python 菇凉,去了一趟浪漫的土耳其,然后一起又去了东京和巴黎,接着 Python 菇凉自己又去了云南的大理. 就在昨天,Pyt ...
- javascript 3d网页 示例 ( three.js 初探 七)
1 完整代码下载 https://pan.baidu.com/s/1JJyVcP2KqXsd5G6eaYpgHQ 提取码 3fzt (压缩包名: 2020-4-5-demo.zip) 2 图片展示 3 ...