Java日期时间API系列30Jdk8中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日
*/publicclass CalculatorPerformanceTest {
/**
* 使用Format方法减少精度到天
*/
@Test
publicvoid 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
publicvoid 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
publicvoid 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:333reduceAccuracyFormat result:
2020-04-23T00:00reduceAccuracyOf cost:
19reduceAccuracyOf result:
2020-04-23T00:00reduceAccuracyWith cost:
24reduceAccuracyWith 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*/
publicstatic 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
*/
publicstatic 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
*/
publicstatic 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
*/
publicstatic 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
*/
publicstatic 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
*/
publicstatic 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
*/
publicstatic 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
*/
publicstatic Date reduceAccuracyToDay(Date date) {
Objects.requireNonNull(date, "date");
return DateTimeConverterUtil.toDate(reduceAccuracyToDay(DateTimeConverterUtil.toLocalDateTime(date)));
}
2.2 测试代码
/*** Date 减少精度测试
*/@Test
publicvoid 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
publicvoid 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:392020-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系列30Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。 的全部内容, 来源链接: utcz.com/z/515779.html