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 ...
随机推荐
- [JVM教程与调优] 什么是JVM运行时参数?
我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ...
- Hive的数据模型及各模块的应用场景
Hive的数据模型 Hive数据模型.png 数据模型组成及应用场景 Hive的数据模型主要有:database.table.partition.bucket四部分: 数据模型之database ...
- 报错代码:svn-http status413'requset entity too large
报错代码:svn-http status413'requset entity too large 发现报错,判断问题.解决问题.记录问题. SVN服务器端排查过没有问题,其他客户端都能正常更新.只有一 ...
- js事件的获取
获取元素样式属性 Method DES clientWidth 获取元素宽度 clientHeight 获取元素高度(内容+内边距) document.body.clientWidth 获取body宽 ...
- zookeeper java代码实现master 选举
1,master选举使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-salve模式,也就是常说的主从模 ...
- Prism 源码解读6-事件聚合
0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用.同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者.如果代码中事件很多就会充斥着各种事件的订阅 ...
- Crash
一.Crash类型 crash 一般产生自 iOS 的微内核 Mach,然后在 BSD 层转换成 UNIX SIGABRT 信号,以标准 POSIX 信号的形式提供给用户.NSException 是使 ...
- centos7环境下安装nginx
安装所需环境 nginx是C语言开发,在Linux和windows环境上面都可以运行. 1.gcc安装 安装nginx需要将官网下载的代码进行编译,编译依赖gcc环境,如果没有gcc环境,需要先安装g ...
- [noip模拟赛]虫洞holes<SPFA>
虫洞(holes.cpp/c/pas) [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差 ...
- [HDU]1166敌兵布阵<静态线段树>
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意:给出n个点,每个点有一个值,现在有三种操作, 1.在i点加上j 2.在i点减去j 3. ...