JAVA常用工具类之“时间刺客”——DateUtils
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相关推荐
- java常用工具类和Hutool常用的工具类整理
java常用工具类和Hutool常用的工具类整理 1.java常用工具类 1.1 Scanner类 /*** Scanner 类*/@Testpublic void testScanner() {Sc ...
- JAVA常用工具类(实用高效)
JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...
- Java常用工具类StringUtils的常用方法
Java常用工具类StringUtils的常用方法 1.该工具类是用于操作Java.lang.String类的. 2.StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字 ...
- Java常用工具类JsonUtils
Java常用工具类JsonUtils 一.项目添加pom文件 <dependency><groupId>com.google.code.gson</groupId> ...
- Hutool Java常用工具类汇总
简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". Hu ...
- Java 常用工具类整理
目录 第一部分:常用的16个工具类 第二部分:java开发常用工具类(正则校验) 第一部分:常用的16个工具类 一.org.apache.commons.io.IOUtils 1.closeQuiet ...
- Java常用工具类之异常、包装类、字符串处理类、集合框架实现类、输入输出流、多线程
集合.多线程和I/O流等 介绍6种常用工具类: 1.如何应用异常处理程序中的问题?2.如何通过包装器类实现基本数据类型的对象化处理?3.字符串处理类String.StringBuilder是如何进行字 ...
- Java 常用工具类 Collections 源码分析
文章出处 文章出自:安卓进阶学习指南 作者:shixinzhang 完稿日期:2017.10.25 Collections 和 Arrays 是 JDK 为我们提供的常用工具类,方便我们操作集合和数组 ...
- java常用工具类_java(二):工作中常用到的工具类
工作中大家要用到很多工具类,第三方的jar中有很多现成的工具类符合自己的项目需要,这个时候就不需要去重复造轮子了,从而节省了很多时间,大家可以利用这些时间去做其它重要的事情,如果没有符合自己的工具类, ...
最新文章
- Python的控制语句2
- mysql数据库核对_Mysql数据库操作总结
- ASP.Net中MD5和SHA1加密的几种方法
- .jar中没有主清单属性_IDEA中spring boot helloword打包运行-0228-2020
- Terminal(终端)中代理的配置---Linux应用中遇到的问题笔记
- 湖南省普通招生2021高考成绩查询,湖南省2021八省联考成绩可查,附查询入口及往年分数线...
- scp 、ssh非22端口的服务器方法
- Mysql之查询优化器 EXPLAIN 详解
- 小米全新潮流系列小米Civi首销5分钟销售额突破2亿元
- 汇编语言常见错误(转载)
- ORACLE分页查询SQL语法——高效的分页
- arcgis 快速制图插件_AutoCAD操作+视频教程+辅助工具和插件,限时分享无套路
- 超快捷的源代码编辑器「Textastic」
- 经典网页设计:25个精美的全屏背景网站设计作品
- win11关闭开机密码的方法
- 密度测量:1.密度测量的基础知识
- 安装MySQL提示cab文件损坏_安装所需的 CAB 文件“Redist.cab”已损坏处理办法
- 处理echarts地图省份坐标重叠的方法
- SUN WPK解包算法
- 草根创业回忆录一: 踏出了第一步的时候...