【第003篇】Java工具类之日期转换和计算

2024-06-04 04:48

本文主要是介绍【第003篇】Java工具类之日期转换和计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

package io.renren.modules.util;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** 日期工具类*/
public class DateUtils {// 英文简写 如:2010-12-01public static final String FORMAT_SHORT = "yyyy-MM-dd";// 英文全称(默认) 如:2010-12-01 23:15:06public static final String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss";//精确到毫秒的完整时间 如:yyyy-MM-dd HH:mm:ss.SSSpublic static final String FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.SSS";// 以毫秒表示的时间private static final long DAY_IN_MILLIS = 24 * 3600 * 1000;private static final long HOUR_IN_MILLIS = 3600 * 1000;private static final long MINUTE_IN_MILLIS = 60 * 1000;private static final long SECOND_IN_MILLIS = 1000;// // formatShortDate// formatLongDate// getNowDate// getNowDateTime// getNow// format// 将日期对象格式化成字符串// /*** 返回格式化日期字符串, 如:2010-12-01** @param date* @return*/public static String formatShortDate(Date date) {return format(date, FORMAT_SHORT);}/*** 返回格式化日期字符串, 如:2010-12-01 23:15:06** @param date* @return*/public static String formatLongDate(Date date) {return format(date, FORMAT_LONG);}/*** 返回当前系统日期, 如:2010-12-01** @return*/public static String getNowDate() {return format(new Date(), FORMAT_SHORT);}/*** 返回当前系统日期时间, 如:2010-12-01 23:15:06** @return*/public static String getNowDateTime() {return format(new Date(), FORMAT_LONG);}/*** 根据用户格式返回当前系统日期或时间** @param format* @return*/public static String getNow(String format) {return format(new Date(), format);}/*** 返回用户格式格式化日期字符串** @param date* @param pattern* @return*/public static String format(Date date, String pattern) {String result = "";if (date != null) {SimpleDateFormat df = new SimpleDateFormat(pattern);result = df.format(date);}return (result);}// // getYear 获取指定日期的年份// getMonth 获取指定日期的月份// getDay 获取指定日期的天// /*** 获取指定日期的年份** @param date* @return*/public static String getYear(Date date) {String result = "";if (date != null) {Calendar cal = Calendar.getInstance();cal.setTime(date);result = String.valueOf(cal.get(Calendar.YEAR));}return result;}/*** 获取指定日期的月份** @param date* @return*/public static String getMonth(Date date) {String result = "";if (date != null) {Calendar cal = Calendar.getInstance();cal.setTime(date);result = String.valueOf(cal.get(Calendar.MONTH) + 1);}return result;}/*** 获取指定日期的天** @param date* @return*/public static String getDay(Date date) {String result = "";if (date != null) {Calendar cal = Calendar.getInstance();cal.setTime(date);result = String.valueOf(cal.get(Calendar.DATE));}return result;}// // parseShortDate// parseLongDate// parse// 将字符串日期解析成日期对象// /*** 使用预设格式提取字符串日期, 如:2010-12-01** @param strDate* @return*/public static Date parseShortDate(String strDate) {return parse(strDate, FORMAT_SHORT);}/*** 使用预设格式提取字符串日期, 如:2010-12-01 23:15:06** @param strDate* @return*/public static Date parseLongDate(String strDate) {return parse(strDate, FORMAT_LONG);}/*** 使用用户格式提取字符串日期** @param strDate* @param pattern* @return*/public static Date parse(String strDate, String pattern) {SimpleDateFormat sdf = new SimpleDateFormat(pattern);try {return sdf.parse(strDate);} catch (ParseException e) {return null;}}// // addYear// addMonth// addDay// addMinute// addWeek// 在指定日期上增加年数、月数、天数、分钟数、周数// getWeekOfYear 获取指定日期是所在年的第几周// /*** 在指定日期上增加数个整年** @param date* @param n    要增加的年数(若减少,则写成负数)* @return*/public static Date addYear(Date date, int n) {Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.YEAR, n);return cal.getTime();}/*** 在指定日期上增加数个整月** @param date* @param n    要增加的月数(若减少,则写成负数)* @return*/public static Date addMonth(Date date, int n) {Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.MONTH, n);return cal.getTime();}/*** 在指定日期上增加天数** @param date* @param n    要增加的天数(若减少,则写成负数)* @return*/public static Date addDay(Date date, int n) {Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.DATE, n);return cal.getTime();}/*** 在指定日期上增加分钟数** @param date* @param n    要增加的分钟数(若减少,则写成负数)* @return*/public static Date addMinute(Date date, int n) {Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.MINUTE, n);return cal.getTime();}/*** 在指定日期上增加周数** @param date* @param n    要增加的周数(若减少,则写成负数)* @return*/public static Date addWeek(Date date, int n) {Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.WEEK_OF_YEAR, n);return cal.getTime();}/*** 获取指定日期是所在年的第几周** @param date* @return*/public static Integer getWeekOfYear(Date date) {Calendar calendar = Calendar.getInstance();calendar.setFirstDayOfWeek(Calendar.MONDAY);calendar.setTime(date);int week = calendar.get(Calendar.WEEK_OF_YEAR);int mouth = calendar.get(Calendar.MONTH);// 如果月份是12月,且求出来的周数是第一周,说明该日期实质上是这一年的第53周,也是下一年的第一周// 如2019.12.29~2019.12.31与2020.1.1~2020.1.4是同一周,在JDK中可能会把前一年末尾的几天判定为下一年的第一周if (mouth >= 11 && week <= 1) {week += 52;}return week;}// // getCalendar// 各种方式获取日历Calendar// /*** 当前日历,这里用中国时间表示** @return*/public static Calendar getCalendar() {return Calendar.getInstance();}/*** 获取指定毫秒数表示的日历** @param millis* @return*/public static Calendar getCalendar(long millis) {Calendar cal = Calendar.getInstance();cal.setTime(new Date(millis));return cal;}/*** 获取指定日期表示的日历** @param date* @return*/public static Calendar getCalendar(Date date) {Calendar cal = Calendar.getInstance();cal.setTime(date);return cal;}// // getDate// 各种方式获取日期对象Date// /*** 获取当期日期对象** @return*/public static Date getDate() {return new Date();}/*** 获取指定毫秒数表示的日期** @param millis* @return*/public static Date getDate(long millis) {return new Date(millis);}// // getMillis// 各种方式获取毫秒数// /*** 获取系统时间的毫秒数** @return*/public static long getMillis() {return System.currentTimeMillis();}/*** 获取指定日历的毫秒数** @param cal* @return*/public static long getMillis(Calendar cal) {return cal.getTime().getTime();}/*** 获取指定日期的毫秒数** @param date* @return*/public static long getMillis(Date date) {return date.getTime();}// // dateDiff 计算两个日期之间的差值// getYearCha 计算两个日期之间相差的周年数// getMonthCha 计算两个日期之间相差的月数// getDayCha 计算两个日期之间相差的天数// countDays 按用户格式字符串计算距离今天的天数// between 获取两个日期相差秒值并回显某(秒/分钟/小时/天)前// /*** 计算两个时间之间的差值** @param flag   计算标志,表示按照年/月/日/时/分/秒等计算* @param calSrc 减数* @param calDes 被减数* @return 两个日期之间的差值*/public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {if (flag == 'y') { // 年return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR));}if (flag == 'M') { // 月return ((calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR)) * 12) + (calSrc.get(Calendar.MONTH) - calDes.get(Calendar.MONTH));}long millisDiff = getMillis(calSrc) - getMillis(calDes);if (flag == 'd') { // 天return (int) (millisDiff / DAY_IN_MILLIS);}if (flag == 'h') { // 小时return (int) (millisDiff / HOUR_IN_MILLIS);}if (flag == 'm') { // 分钟return (int) (millisDiff / MINUTE_IN_MILLIS);}if (flag == 's') { // 秒return (int) (millisDiff / SECOND_IN_MILLIS);}return 0;}/*** 计算两个时间之间的差值** @param flag    计算标志,表示按照年/月/日/时/分/秒等计算* @param dateSrc 减数* @param dateDes 被减数* @return 两个日期之间的差值*/public static int dateDiff(char flag, Date dateSrc, Date dateDes) {Calendar calSrc = Calendar.getInstance();calSrc.setTime(dateSrc);Calendar calDes = Calendar.getInstance();calDes.setTime(dateDes);return dateDiff(flag, calSrc, calDes);}/*** 计算两个日期之间相差的周年数** @param date1* @param date2* @return*/public static int getYearCha(Date date1, Date date2) {return dateDiff('y', date1, date2);}/*** 计算两个日期之间相差的周年数** @param dateStr1* @param dateStr2* @param pattern* @return*/public static int getYearCha(String dateStr1, String dateStr2, String pattern) {Date date1 = parse(dateStr1, pattern);Date date2 = parse(dateStr2, pattern);return getYearCha(date1, date2);}/*** 计算两个日期之间相差的月数** @param date1* @param date2* @return*/public static int getMonthCha(Date date1, Date date2) {return dateDiff('M', date1, date2);}/*** 计算两个日期之间相差的月数** @param dateStr1* @param dateStr2* @param pattern* @return*/public static int getMonthCha(String dateStr1, String dateStr2, String pattern) {Date date1 = parse(dateStr1, pattern);Date date2 = parse(dateStr2, pattern);return getMonthCha(date1, date2);}/*** 计算两个日期之间相差的天数** @param date1* @param date2* @return*/public static int getDayCha(Date date1, Date date2) {return dateDiff('d', date1, date2);}/*** 计算两个日期之间相差的天数** @param dateStr1* @param dateStr2* @param pattern* @return*/public static int getDayCha(String dateStr1, String dateStr2, String pattern) {Date date1 = parse(dateStr1, pattern);Date date2 = parse(dateStr2, pattern);return getDayCha(date1, date2);}/*** 按用户格式字符串计算距离今天的天数** @param date* @param format* @return*/public static int countDays(String date, String format) {Calendar calSrc = Calendar.getInstance();Calendar calDes = Calendar.getInstance();calDes.setTime(parse(date, format));return dateDiff('d', calSrc, calDes);}/*** 按默认格式的字符串计算距离今天的天数, 如:2010-12-01 23:15:06** @param date* @return*/public static int countDays(String date) {return countDays(date, FORMAT_LONG);}/*** 获取两个日期相差秒值并回显某(秒/分钟/小时/天)前** @param begin* @param end* @return*/public static String between(Date begin, Date end) {String msg = "";long expire = dateDiff('s', begin, end);expire = Math.abs(expire);// 取绝对值if (expire < 60) {msg = expire + "秒前";} else if (expire == 60) {long m = expire / 60;msg = m + "分钟";} else if (expire > 60 && expire < 3600) {long m = expire / 60;msg = m + "分钟前";} else if (expire == 3600) {long h = expire / 3600;msg = h + "小时";} else if (expire > 3600 && expire < 86400) {long h = expire / 3600;msg = h + "小时前";} else if (expire == 86400) {long d = expire / 86400;msg = d + "天";} else {long d = expire / 86400;msg = d + "天前";}return msg;}/*** 获取两个日期相差秒值并回显某(秒/分钟/小时/天)前** @param begin* @param end* @param format* @return*/public static String between(String begin, String end, String format) {Date date1 = parse(begin, format);Date date2 = parse(end, format);return between(date1, date2);}// // compareDate// 比较日期大小// /*** 比较日期大小** @param date1* @param date2* @return*/public static int compareDate(String date1, String date2) {return compareDate(date1, date2, FORMAT_LONG);}/*** 比较日期大小** @param date1* @param date2* @param pattern* @return*/public static int compareDate(String date1, String date2, String pattern) {Calendar c1 = Calendar.getInstance();Calendar c2 = Calendar.getInstance();c1.setTime(parse(date1, pattern));c2.setTime(parse(date2, pattern));//result==0:相等//result<0:date1小于date2//result>0:date1大于date2int result = c1.compareTo(c2);return result;}// // dataToUpper// 日期转化为大写// /*** 日期转化为大写** @param dateStr* @return*/public static String dataToUpper(String dateStr) {String res = "";Date date = parse(dateStr, FORMAT_SHORT);if (date != null) {Calendar ca = Calendar.getInstance();ca.setTime(date);int year = ca.get(Calendar.YEAR);int month = ca.get(Calendar.MONTH) + 1;int day = ca.get(Calendar.DAY_OF_MONTH);res = numToUpper(year) + "年" + monthToUppder(month) + "月" + dayToUppder(day) + "日";}return res;}/*** 将数字转化为大写** @param num* @return*/private static String numToUpper(int num) {// String u[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};String u[] = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};char[] str = String.valueOf(num).toCharArray();String rstr = "";for (int i = 0; i < str.length; i++) {rstr = rstr + u[Integer.parseInt(str[i] + "")];}return rstr;}/*** 月转化为大写** @param month* @return*/private static String monthToUppder(int month) {if (month < 10) {return numToUpper(month);} else if (month == 10) {return "十";} else {return "十" + numToUpper(month - 10);}}/*** 日转化为大写** @param day* @return*/private static String dayToUppder(int day) {if (day < 20) {return monthToUppder(day);} else {char[] str = String.valueOf(day).toCharArray();if (str[1] == '0') {return numToUpper(Integer.parseInt(str[0] + "")) + "十";} else {return numToUpper(Integer.parseInt(str[0] + "")) + "十" + numToUpper(Integer.parseInt(str[1] + ""));}}}// // getSeason 根据日期获取日期所在季度// getQuarterStartEndTime 根据季度数获取季度的开始时间结束时间// /*** 根据日期获取日期所在季度** @param date* @return*/public static int getSeason(Date date) {int season = 0;Calendar c = Calendar.getInstance();c.setTime(date);int month = c.get(Calendar.MONTH);switch (month) {case Calendar.JANUARY:case Calendar.FEBRUARY:case Calendar.MARCH:season = 1;break;case Calendar.APRIL:case Calendar.MAY:case Calendar.JUNE:season = 2;break;case Calendar.JULY:case Calendar.AUGUST:case Calendar.SEPTEMBER:season = 3;break;case Calendar.OCTOBER:case Calendar.NOVEMBER:case Calendar.DECEMBER:season = 4;break;default:break;}return season;}/*** 根据季度数获取季度的开始时间结束时间** @param quarter* @return*/public static Map<String, Date> getQuarterStartEndTime(int quarter) {Map<String, Date> result = new HashMap<>();Calendar start = Calendar.getInstance();Calendar end = Calendar.getInstance();if (quarter == 1) {start.set(Calendar.MONTH, 0);start.set(Calendar.DATE, 1);end.set(Calendar.MONTH, 2);end.set(Calendar.DATE, 31);} else if (quarter == 2) {start.set(Calendar.MONTH, 3);start.set(Calendar.DATE, 1);end.set(Calendar.MONTH, 5);end.set(Calendar.DATE, 30);} else if (quarter == 3) {start.set(Calendar.MONTH, 6);start.set(Calendar.DATE, 1);end.set(Calendar.MONTH, 8);end.set(Calendar.DATE, 30);} else if (quarter == 4) {start.set(Calendar.MONTH, 9);start.set(Calendar.DATE, 1);end.set(Calendar.MONTH, 11);end.set(Calendar.DATE, 31);}start.set(Calendar.HOUR, 0);start.set(Calendar.MINUTE, 0);start.set(Calendar.SECOND, 0);end.set(Calendar.HOUR, 23);end.set(Calendar.MINUTE, 59);end.set(Calendar.SECOND, 59);result.put("startTime", start.getTime());result.put("endTime", end.getTime());return result;}/*** 根据时间获取季度的开始时间结束时间** @param date* @return*/public static Map<String, Date> getQuarterStartEndTime(Date date) {int quarter = getSeason(date);return getQuarterStartEndTime(quarter);}
}

这篇关于【第003篇】Java工具类之日期转换和计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029107

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息