常用工具类系列之DateUtil

简介: Date、long、Calendar之间的相互转换//当前时间Date date = DateUtil.date();//当前时间Date date2 = DateUtil.date(Calendar.

Date、long、Calendar之间的相互转换

//当前时间
Date date = DateUtil.date();
//当前时间
Date date2 = DateUtil.date(Calendar.getInstance());
//当前时间 Date date3 = DateUtil.date(System.currentTimeMillis()); //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss String now = DateUtil.now(); //当前日期字符串,格式:yyyy-MM-dd String today= DateUtil.today();

字符串转日期

DateUtil.parse方法会自动识别一些常用格式,包括:

  1. yyyy-MM-dd HH:mm:ss
  2. yyyy-MM-dd
  3. HH:mm:ss
  4. yyyy-MM-dd HH:mm
  5. yyyy-MM-dd HH:mm:ss.SSS
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);

我们也可以使用自定义日期格式转化:

String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");

格式化日期输出

String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);

String format = DateUtil.format(date, "yyyy/MM/dd"); Assert.assertEquals("2017/03/01", format); //常用格式的格式化 String formatDate = DateUtil.formatDate(date); Assert.assertEquals("2017-03-01", formatDate); String formatDateTime = DateUtil.formatDateTime(date); Assert.assertEquals("2017-03-01 00:00:00", formatDateTime); String formatTime = DateUtil.formatTime(date); Assert.assertEquals("00:00:00", formatTime);

获取Date对象的某个部分

Date date = DateUtil.date();
//获得年的部分
DateUtil.year(date);
//获得月份,从0开始计数
DateUtil.month(date);
//获得月份枚举
DateUtil.monthEnum(date);
//.....

开始和结束时间

有的时候我们需要获得每天的开始时间、结束时间,每月的开始和结束时间等等,DateUtil也提供了相关方法:

String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr); //一天的开始 Date beginOfDay = DateUtil.beginOfDay(date); Assert.assertEquals("2017-03-01 00:00:00", beginOfDay.toString()); //一天的结束 Date endOfDay = DateUtil.endOfDay(date); Assert.assertEquals("2017-03-01 23:59:59", endOfDay.toString());

日期时间偏移

日期或时间的偏移指针对某个日期增加或减少分、小时、天等等,达到日期变更的目的。Hutool也针对其做了大量封装

String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);

Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2); Assert.assertEquals("2017-03-03 22:33:23", newDate.toString()); //常用偏移 DateTime newDate2 = DateUtil.offsetDay(date, 3); Assert.assertEquals("2017-03-04 22:33:23", newDate2.toString()); //常用偏移 DateTime newDate3 = DateUtil.offsetHour(date, -3); Assert.assertEquals("2017-03-01 19:33:23", newDate3.toString()); 

针对当前时间,提供了简化的偏移方法(例如昨天、上周、上个月等):

//昨天
DateUtil.yesterday()
//明天
DateUtil.tomorrow()
//上周
DateUtil.lastWeek()
//下周
DateUtil.nextWeek()
//上个月 DateUtil.lastMonth() //下个月 DateUtil.nextMonth()

日期时间差

有时候我们需要计算两个日期之间的时间差(相差天数、相差小时数等等),Hutool将此类方法封装为between方法:

String dateStr1 = "2017-03-01 22:33:23";
Date date1 = DateUtil.parse(dateStr1);

String dateStr2 = "2017-04-01 23:33:23"; Date date2 = DateUtil.parse(dateStr2); long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY); Assert.assertEquals(31, betweenDay);//相差一个月,31天

格式化时间差

有时候我们希望看到易读的时间差,比如XX天XX小时XX分XX秒,此时使用DateUtil.formatBetween方法:

//Level.MINUTE表示精确到分
String formatBetween = DateUtil.formatBetween(between, Level.MINUTE);
//输出:31天1小时
Console.log(formatBetween);

计时器

计时器用于计算某段代码或过程花费的时间

TimeInterval timer = DateUtil.timer();

//---------------------------------
//-------这是执行过程
//---------------------------------

timer.interval();//花费毫秒数
timer.intervalRestart();//返回花费时间,并重置开始时间 timer.intervalMinute();//花费分钟数

其它

//年龄
DateUtil.ageOfNow("1990-01-30");

//是否闰年
DateUtil.isLeapYear(2017);

 

相关文章
|
IDE API 开发工具
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件
348 3
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件
|
关系型数据库 数据库 PostgreSQL
PostgreSQL批量删除数据
当需要对一些不需要的历史数据进行大批量删除时, 在使用delete语句时,会发现在删除一些数据时会非常慢 比如 DELETE FROM test where id < 10000; 删除缓慢的原因主要在于外键约束,当数据库在有约束的情况下,无论进行删除或者更新操作, 都会对相关表进行一个校验,判断相关表的相关记录是否被删除或者更新。 这个检查的过程会非常慢, 尤其在外建表又关联着外建表的这种层层嵌套的情况下。
2459 0
|
5月前
|
运维 监控 数据可视化
容器化部署革命:Docker实战指南
容器化部署革命:Docker实战指南
|
负载均衡 关系型数据库 MySQL
MySQL 主主复制与主从复制对比
MySQL的主主复制和主从复制是两种常见的数据库复制配置方式,各有优缺点和适用场景。以下是对这两种复制方式的详细对比: ### 主从复制 (Master-Slave Replication) **特点:** 1. **单向复制**:数据从主服务器复制到一个或多个从服务器。从服务器只能从主服务器接收数据更新,不能向主服务器发送数据。 2. **读写分离**:主服务器处理写操作(INSERT、UPDATE、DELETE),从服务器处理读操作(SELECT),可以分担读负载,提高系统的整体性能。 3. **数据一致性**:数据在主服务器上是最新的,从服务器上可能会有一定的延迟。 **优点:**
934 1
|
传感器 人工智能 数据可视化
数字孪生在航空航天领域的应用
【10月更文挑战第31天】数字孪生技术通过创建物理实体的虚拟复制品,实现实时模拟、预测和优化,已在航空航天领域广泛应用。例如,NASA在阿波罗工程中使用地面飞船模拟实际飞行状态,中国嫦娥五号探测器利用数字孪生技术进行在轨运行评估。此外,C919客机研发中也应用了数字孪生系统,提高了设计和制造效率。未来,数字孪生将结合物联网、大数据等技术,进一步提升航空航天领域的智能化水平。
|
人工智能 安全 搜索推荐
AI智能体研发之路-模型篇(三):中文大模型开、闭源之争
AI智能体研发之路-模型篇(三):中文大模型开、闭源之争
622 1
文本,vitepress两栏怎样设置,应用场景是每个导航都是单独的markdown文件
文本,vitepress两栏怎样设置,应用场景是每个导航都是单独的markdown文件
|
中间件 Java 应用服务中间件
工行银企互联接入详解(4)--NC中间件部署
本文目录 1. 背景 2. 原理 3. 声明 4. 部署流程 4.1 下载并解压NC中间件 4.2 修改Web.Config文件,如下图: 4.3 启用IIS功能 4.4 在IIS管理器中添加网站 4.5 测试中间件是否部署成功 4.6 测试中间件参数是否正确 5. 总结
580 75
工行银企互联接入详解(4)--NC中间件部署
|
缓存 自然语言处理 Java
还在为字典值、枚举值校验烦恼吗,不妨试试这个
本文介绍了如何在Java中实现常量值校验的封装,主要包括两个方面:字典值类型的校验和枚举类型的校验。首先,作者提到在进行数据验证时,实体类字段需要添加`@Valid`注解。然后,对于字典值类型的校验,可以通过`@DictVaild`注解检查当前字段值是否在数据库中的字典值类别内,或者与预定义的枚举类中的值相匹配。在进行校验时,可以设置`dictType`参数为`DictType.CODE`或`DictType.LABEL`来分别验证代码值或标签值。
460 0
|
弹性计算 运维 Cloud Native
阿里云云原生弹性方案,用弹性解决集群资源利用率难题
本文主要介绍了通过弹性,实现成本优化,解决集群资源利用率难题。
93265 8