DateUtils :

写代码时最常见的“兄弟”——时间处理工具类DateUtils

首先,我们需要先准备几样“东西”:

//  时区public static final int DEFAULT_TIME_ZONE = 0;// 中国时区public static final int CHINA_TIME_ZONE = 8;+++++++++划重点:常见时间格式:private static final String[] prototypePatterns ={   "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss","yyyy-MM-dd HH:mm", "HH:mm:ss.SSS", "yyyy-MM-dd", "dd-MM-yyyy","yy-MM-dd", "MM-dd-yyyy", "HH:mm:ss","HH:mm"};public static final DateTimeFormatter DATE_TIME_FORMATTER= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");public static final DateTimeFormatter DATE_FORMATTER= DateTimeFormatter.ofPattern("yyyy-MM-dd");//东八区上海时区public static final ZoneId CHINA_ZONE_ID = ZoneId.of("Asia/Shanghai");
/*** 获取东8区的某一天的开始时间和结束时间** @param time* @return Instant[]*/public static Instant[] getDayStartTimeAndEndTime(Instant time) {//获取北京时间的零点ZoneId zoneId = CHINA_ZONE_ID;LocalDateTime localDateTime = LocalDateTime.ofInstant(time, zoneId);//获取当天的开始时间Instant minTime = localDateTime.toLocalDate().atStartOfDay(zoneId).toInstant();//获取当天的结束时间Instant maxTime = localDateTime.toLocalDate().atStartOfDay(zoneId).plusDays(1L).plusSeconds(-1L).toInstant();return new Instant[]{minTime, maxTime};}

目录

DateUtils :


获取东8区的某个月的开始时间和结束时间

/*** 获取东8区的某个月的开始时间和结束时间** @param time* @return*/public static Instant[] getMonthStartTimeAndEndTime(Instant time) {LocalDateTime LocalBegin = time.atZone(CHINA_ZONE_ID).toLocalDateTime();Instant minTime = LocalBegin.minusDays(LocalBegin.getDayOfMonth()).toLocalDate().atStartOfDay(CHINA_ZONE_ID).toInstant();Instant maxTime = LocalBegin.minusDays(LocalBegin.getDayOfMonth()).minus(-1, ChronoUnit.MONTHS).toLocalDate().atStartOfDay(CHINA_ZONE_ID).minus(1L,ChronoUnit.MILLIS).toInstant();return new Instant[]{minTime, maxTime};}

 判断两个Instant类型的时间,是否为同一天

/*** 是否为同一天** @param date1* @param date2* @return*/public static boolean isSameDate(Instant date1, Instant date2) {ZoneId zoneId = CHINA_ZONE_ID;LocalDate localDate1 = LocalDateTime.ofInstant(date1, zoneId).toLocalDate();LocalDate localDate2 = LocalDateTime.ofInstant(date2, zoneId).toLocalDate();return localDate1.compareTo(localDate2) == 0;}

接下来就是最刺激的类型互转了: 

1、Instant转为(String)类型

/*** Instant转中国标准时间** @param confirmTime* @return*/public static String toChinaTimeFormat(Instant confirmTime) {if (confirmTime == null) {return null;}return DATE_TIME_FORMATTER.format(LocalDateTime.ofInstant(confirmTime, CHINA_ZONE_ID));}public void test(){String s = toChinaTimeFormat(Instant.now());System.out.println(s);}输出:2021-08-05 17:17:05// DATE_TIME_FORMATTER是前面设置的日期格式哦,也可以换别的!

//本来想解释一下ofInstant()源码的,但网上仿佛更全面,有兴趣的同学可以百度

2、LocalDate和Instant类型互转

/*** localDateToInstant* @param date* @return*/public static Instant localDateToInstant(LocalDate date) {ZoneId zone = ZoneId.systemDefault();return date.atStartOfDay().atZone(zone).toInstant();}@Testpublic void test(){Instant instant = localDateToInstant(LocalDate.now());System.out.println(instant);}
输出结果:2021-08-04T16:00:00Z  (采用的是系统默认的时区)
注:LocalDate.now()获取的是当天日期,转还为Instant时,是从当日0点算起的/*** instantToLocalDate* @param instant* @return*/public static LocalDate instantToLocalDate(Instant instant) {ZoneId zone = ZoneId.systemDefault();return instant.atZone(zone).toLocalDate();}
输出结果:2021-08-05  (采用的是指定的时区)

3.Date和Instant类型互转

/*** date2Instant* @param date* @return*/public static Instant date2Instant(Date date){if(date == null){return null;}return Instant.ofEpochMilli(date.getTime());}/*** instant2Date* @param instant* @return*/public static Date instant2Date(Instant instant){if(instant == null){return null;}return Date.from(instant);}

4.Instant和LocalDateTime互转

 /*** instant2LocalDateTime* @param instant* @return*/public static LocalDateTime instant2LocalDateTime(Instant instant){if(instant == null){return null;}return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());}/*** instant2LocalDateTime* @param instant* @return*/public static LocalDateTime instant2LocalDate(Instant instant){if(instant == null){return null;}return instant2LocalDateTime(instant).toLocalDateTime();}

5.LocalDate和LocalDateTime转为Date

 /*** LocalDateTime转换为Date* @param localDateTime*/public static Date localDateTime2Date(LocalDateTime localDateTime){if(localDateTime == null){return null;}ZoneId zoneId = ZoneId.systemDefault();ZonedDateTime zdt = localDateTime.atZone(zoneId);return  Date.from(zdt.toInstant());}/*** LocalDate转换为Date* @param localDate*/public static Date localDate2Date(LocalDate localDate){if(localDate == null){return null;}ZoneId zoneId = ZoneId.systemDefault();Instant instant = localDate.atStartOfDay().atZone(zoneId).toInstant();return  Date.from(instant);}

=====================================================

时间常用业务

6.计算生日

 /*** 获取年龄** @param birthLocalDate* @return* @throws Exception*/public static int getAge(LocalDate birthLocalDate) {Date birthDay = new Date(DateUtils.localDateToInstant(birthLocalDate).toEpochMilli());Calendar cal = Calendar.getInstance();if (cal.before(birthDay)) {throw new IllegalArgumentException("The birthDay is before Now.It's unbelievable!");}int yearNow = cal.get(Calendar.YEAR);int monthNow = cal.get(Calendar.MONTH);int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);cal.setTime(birthDay);int yearBirth = cal.get(Calendar.YEAR);int monthBirth = cal.get(Calendar.MONTH);int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);int age = yearNow - yearBirth;if (monthNow <= monthBirth) {if (monthNow == monthBirth) {if (dayOfMonthNow < dayOfMonthBirth) {age--;}} else {age--;}}return age;}

7.只保留日期的Instant

 /*** 只保留日期** @param datetime 带时间的* @return 去掉时间的时间*/public static Instant truncatedToDate(Instant datetime) {return datetime.truncatedTo(ChronoUnit.DAYS);}

8.今天星期天,明天星期几呢

 /*** 获取下一天的星期几, LocalDateTime.dayOfWeek().getValue() 1~7** @param dow 当前星期几* @return 下一天星期几*/public static Integer nextDayOfWeekValue(Integer dow) {return dow == 7 ? 1 : dow + 1;}

9.获取最大的Instant

 /*** 获取最大的Instant* @param instants* @return*/public static Instant getMaxInstant(Instant... instants) {if(instants == null || instants.length == 0){return null;}Instant result = null;for (Instant date : instants) {if(date == null){continue;}if(result == null || date.compareTo(result) > 0){result = date;}}return result;}

获取当前天零点的格林威治时间:

例如: 当天零点 2021-11-03 00:00:00  格林威治时间:2021-11-02 16:00:00

LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), UTC);Instant zeroToday = localDateTime.toLocalDate().atStartOfDay(UTC).toLocalDateTime().minusHours(8).toInstant(UTC);
// 比较Instant时间
attendanceRecordsDTO.getAllowCheckTime().isBefore(attendanceRecordsDTO.getUserCheckTime())// 时间加(分钟)
attendanceRecords.getBaseCheckTime().plusMillis(TimeUnit.MINUTES.toMillis(flexibleSettings.getLate().getArrive()))// 时间减(分钟)
attendanceRecords.getBaseCheckTime().minusMillis(TimeUnit.MINUTES.toMillis(flexibleSettings.getLate().getArrive()))// 计算两个时间相差多少分钟,结果为long型ChronoUnit.MINUTES.between(Instant ,Instant);

JAVA常用工具类之“时间刺客”——DateUtils相关推荐

  1. java常用工具类和Hutool常用的工具类整理

    java常用工具类和Hutool常用的工具类整理 1.java常用工具类 1.1 Scanner类 /*** Scanner 类*/@Testpublic void testScanner() {Sc ...

  2. JAVA常用工具类(实用高效)

    JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...

  3. Java常用工具类StringUtils的常用方法

    Java常用工具类StringUtils的常用方法 1.该工具类是用于操作Java.lang.String类的. 2.StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字 ...

  4. Java常用工具类JsonUtils

    Java常用工具类JsonUtils 一.项目添加pom文件 <dependency><groupId>com.google.code.gson</groupId> ...

  5. Hutool Java常用工具类汇总

    简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...

  6. Java 常用工具类整理

    目录 第一部分:常用的16个工具类 第二部分:java开发常用工具类(正则校验) 第一部分:常用的16个工具类 一.org.apache.commons.io.IOUtils 1.closeQuiet ...

  7. Java常用工具类之异常、包装类、字符串处理类、集合框架实现类、输入输出流、多线程

    集合.多线程和I/O流等 介绍6种常用工具类: 1.如何应用异常处理程序中的问题?2.如何通过包装器类实现基本数据类型的对象化处理?3.字符串处理类String.StringBuilder是如何进行字 ...

  8. Java 常用工具类 Collections 源码分析

    文章出处 文章出自:安卓进阶学习指南 作者:shixinzhang 完稿日期:2017.10.25 Collections 和 Arrays 是 JDK 为我们提供的常用工具类,方便我们操作集合和数组 ...

  9. java常用工具类_java(二):工作中常用到的工具类

    工作中大家要用到很多工具类,第三方的jar中有很多现成的工具类符合自己的项目需要,这个时候就不需要去重复造轮子了,从而节省了很多时间,大家可以利用这些时间去做其它重要的事情,如果没有符合自己的工具类, ...

最新文章

  1. Python的控制语句2
  2. mysql数据库核对_Mysql数据库操作总结
  3. ASP.Net中MD5和SHA1加密的几种方法
  4. .jar中没有主清单属性_IDEA中spring boot helloword打包运行-0228-2020
  5. Terminal(终端)中代理的配置---Linux应用中遇到的问题笔记
  6. 湖南省普通招生2021高考成绩查询,湖南省2021八省联考成绩可查,附查询入口及往年分数线...
  7. scp 、ssh非22端口的服务器方法
  8. Mysql之查询优化器 EXPLAIN 详解
  9. 小米全新潮流系列小米Civi首销5分钟销售额突破2亿元
  10. 汇编语言常见错误(转载)
  11. ORACLE分页查询SQL语法——高效的分页
  12. arcgis 快速制图插件_AutoCAD操作+视频教程+辅助工具和插件,限时分享无套路
  13. 超快捷的源代码编辑器「Textastic」
  14. 经典网页设计:25个精美的全屏背景网站设计作品
  15. win11关闭开机密码的方法
  16. 密度测量:1.密度测量的基础知识
  17. 安装MySQL提示cab文件损坏_安装所需的 CAB 文件“Redist.cab”已损坏处理办法
  18. 处理echarts地图省份坐标重叠的方法
  19. SUN WPK解包算法
  20. 草根创业回忆录一: 踏出了第一步的时候...

热门文章

  1. 年前最后一趟车,来年要少开车、慎开车
  2. 【计算机网络】学习笔记:第二章 物理层(五千字详细配图)【王道考研】
  3. 计算机网络(5)——OSI参考模型
  4. Android TextView maxWidth、maxLines、maxLength、maxEms
  5. C++ 用libcurl库进行http通讯网络编程
  6. 电商假货品牌如何应对
  7. T110Balanced Binary Tree
  8. python 时间序列分解案例——加法分解seasonal_decompose
  9. 使用 IntelliJ IDEA 查看服务器日志文件
  10. 五轴机床有很多种类型,你都知道吗?