Java日期时间API系列30

Wesley13
• 阅读 779

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这