Joda的Maven坐标
如果使用JDK1.8默认已经集成了Joda
<!-- 时间操作组件 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.5</version> </dependency> <!-- 时间toLocalDateTime --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency>
基于joda封装的--日期时间工具类(更新中)
// ++++++++【格式转换】+++++++++
1.将 String 转为 date
2.日期字符串格式化输出
3.Date类型日期转字符串格式化输出
4.获取当前指定格式的系统时间
// ++++++++【日期加减】+++++++++
1.增加天数后的Date日期
2.减少天数后的日期
3.增加月数后的日期
4.减少月数后的日期
5.减少年数后的日期
// ++++++++【日期间隔】+++++++++
1.和当前系统时间相隔的分钟数
2.获取start到end的时间间隔
// ++++++++【工作日/节假日/周末判断】+++++++++
1.判断是否为交易日/工作日
2.判断是否是周末
3.判断是否为国家法定节假日
4.判断是否为国家调整后的工作日
5.判断目标时间是否在区间内
6.判断两个日期(一个Date类型一个String类型)是否在同一天
// ++++++++【查看月份、年份,星期】+++++++++
1.根据日期<Date>获得当前星期几
2.根据日期<String>获得【星期】
3.根据日期<String>获得【月份】
4.根据日期<String>获得【年份】
5.根据日期<年份月份>获得【年份】
6.根据日期<年份月份>获得【月份】
7.根据日期<String>获得【月-日】
8.根据日期<String>获得【年-月】
9.当前时间的毫秒数
package ...; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.joda.time.Days; import org.joda.time.Minutes; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import static org.apache.poi.ss.usermodel.DateUtil.toLocalDateTime; /** * @version V1.0 * @Title: Joda日期时间--工具类 * @ClassName:DateTimeUtils.java * @Description: * * // ++++++++【格式转换】+++++++++ * 1.将 String 转为 date * 2.日期字符串格式化输出 * 3.Date类型日期转字符串格式化输出 * 4.获取当前指定格式的系统时间 * * // ++++++++【日期加减】+++++++++ * 1.增加天数后的Date日期 * 2.减少天数后的日期 * 3.增加月数后的日期 * 4.减少月数后的日期 * 5.减少年数后的日期 * * // ++++++++【日期间隔】+++++++++ * 1.和当前系统时间相隔的分钟数 * 2.获取start到end的时间间隔 * * // ++++++++【工作日/节假日/周末判断】+++++++++ * 1.判断是否为交易日/工作日 * 2.判断是否是周末 * 3.判断是否为国家法定节假日 * 4.判断是否为国家调整后的工作日 * 5.判断目标时间是否在区间内 * 6.判断两个日期(一个Date类型一个String类型)是否在同一天 * * // ++++++++【查看月份、年份,星期】+++++++++ * 1.根据日期<Date>获得当前星期几 * 2.根据日期<String>获得【星期】 * 3.根据日期<String>获得【月份】 * 4.根据日期<String>获得【年份】 * 5.根据日期<年份月份>获得【年份】 * 6.根据日期<年份月份>获得【月份】 * 7.根据日期<String>获得【月-日】 * 8.根据日期<String>获得【年-月】 * 9.当前时间的毫秒数 * * @Copyright 2016-2017 - Powered By 研发中心 * @author: 王延飞 * @date:2016年12月24日 上午10:54:27 */ public class DateTimeUtils { /** * 时间格式常量 */ public static final String COMMON_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static final String COMMON_PATTERN_TYPE2 = "yyyy/MM/dd HH:mm:ss"; public static final String SHORT_PATTERN = "yyyy-MM-dd"; public static final String SHORT_PATTERN_TYPE2 = "yyyy/MM/dd"; public static final String LONG_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String SUP_SHORT_PATTERN = "yyyyMMdd"; public static final String SUP_LONG_PATTERN = "yyyyMMddHHmmss"; public static final String YEAR_MONTH = "yyyyMM"; public static final String YEAR = "yyyy"; public static final String CN_SHORT_PATTERN = "yyyy年MM月dd日"; public static final String CN_YEAR_MONTH = "yyyy年MM月"; public static final String DDMM_PATTERN = "ddMM"; // ++++++++【格式转换】+++++++++ /** * 1、将 String 解析为 date * * @param dateString 待解析的日期字符串 * @param pattern 日期字符串的时间格式 * @return */ public static Date trans2Date(String dateString, String pattern) { String fRTN = StringUtils.isNotBlank(pattern) ? pattern : COMMON_PATTERN; DateTimeFormatter format = DateTimeFormat.forPattern(fRTN); DateTime dt = DateTime.parse(dateString, format); return dt.toDate(); } /** * 2、日期字符串格式化输出 * *@param * dateString 待格式化的日期字符串 * *@param * fromPattern 待格式化日期字符串的格式 * * @param * toPattern 格式化后的日期格式 *@return */ public static String formatDate2String(String dateString, String fromPattern, String toPattern) { String tRTN = StringUtils.isNotBlank(toPattern) ? toPattern : COMMON_PATTERN; DateTimeFormatter format = DateTimeFormat.forPattern(fromPattern); DateTime dt = DateTime.parse(dateString, format); return dt.toString(tRTN); } /** * 3、Date类型日期转字符串格式化输出 * * @param date 待格式化的日期 * @param pattern 格式化后的格式 * @return */ public static String formatDate2String(Date date, String pattern) { String fRTN = StringUtils.isNotBlank(pattern) ? pattern : COMMON_PATTERN; DateTimeFormatter format = DateTimeFormat.forPattern(fRTN); return new DateTime(date).toString(format); } /** * @return String * @Title: 4.获取当前指定格式的系统时间 <br/> * <br/> * <格式 :yyyy-MM-dd HH:mm:ss> * @Description: * @author: 王延飞 * @date:2016年12月24日 上午10:59:14 */ public static String getCurSysTime(String pattern) { String fRTN = StringUtils.isNotBlank(pattern) ? pattern : COMMON_PATTERN; // 初始化时间 DateTime dateTime = new DateTime(); return dateTime.toString(fRTN); } // ++++++++【日期加减】+++++++++ /** * 1、增加天数后的Date日期 * * @param date 起点日期(date/string) * @param daysCount 增加天数 * @return */ public static <T> Date add(T date, int daysCount) { DateTime dt = new DateTime(date); return dt.plusDays(daysCount).toDate(); } /** *2、减少天数后的日期 * * @param date 起点日期(date/string) * @param daysCount 减少的天数 * @return */ public static <T> Date sub(T date, int daysCount) { DateTime dt = new DateTime(date); return dt.minusDays(daysCount).toDate(); } /** * 3、增加月数后的日期 * * @param date 起点日期(date/string) * @param months 增加月数 * @return */ public static <T> Date addMonths(T date, int months) { DateTime dt = new DateTime(date); return dt.plusMonths(months).toDate(); } /** * 4、减少月数后的日期 * * @param * date 起点日期(date/string) * * @param * months 减少的月数 * @return */ public static <T> Date subMonths(T date, int months) { DateTime dt = new DateTime(date); return dt.minusMonths(months).toDate(); } /** * 5、减少年数后的日期 * * @param * date 起点日期(date/string) * * @param * years 减少的年数 * @return */ public static <T> Date subYears(T date, int years) { DateTime dt = new DateTime(date); return dt.minusYears(years).toDate(); } // ++++++++【日期间隔】+++++++++ /** * @param date * @return int * @Title: 1.和当前系统时间相隔的分钟数 * @methodName: minutesBetween * @Description: * @author: 王延飞 * @date: 2017-06-29 15:01 */ public static int minutesBetween(Date date) { // 系统当前时间 DateTime SysTime = new DateTime(); DateTime dateTime = null; if (date != null) { dateTime = new DateTime(date); } int minutes = Minutes.minutesBetween(dateTime, SysTime).getMinutes(); return minutes; } /** * @Title: 2.获取start到end的时间间隔 * @MethodName: getBetweenDate * @param start 开始时间 * @param end 结束时间 * @param interval 时间间隔 * @Return long * @Exception * @Description: * * @author: 王延飞 * @date: 2021/6/5 11:15 */ public static long getBetweenDate(Date start, Date end,String interval) { ChronoUnit chronoUnit = ChronoUnit.DAYS; switch (interval) { case "DAYS": chronoUnit = ChronoUnit.DAYS; break; case "WEEKS": chronoUnit = ChronoUnit.WEEKS; break; case "MONTHS": chronoUnit = ChronoUnit.MONTHS; break; case "YEARS": chronoUnit = ChronoUnit.YEARS; break; default: chronoUnit = ChronoUnit.DAYS; } return toLocalDate(start).until(toLocalDate(end), chronoUnit); } public static java.time.LocalDate toLocalDate(Date d) { return toLocalDateTime(d).toLocalDate(); } // ++++++++++++++++++++++++++++++++++++++++++++++++【工作日/节假日/周末判断】+++++++++++++++++++++++++++++++++++++++++++++++++ /** * 1、判断是否为交易日/工作日 * * @param date 待判断日期(date/string) * @return */ public static <T> boolean isTradeDay(T date) { boolean isTD = false; DateTime dt = new DateTime(date); if (isSpWorkDay(dt) || (!isHoliday(dt) && !isWeekEnd(dt))) { isTD = true; } return isTD; } /** * @Title: 2. 判断是否是周末 * @MethodName: isWeekEnd * @param dt * @Return boolean * @Exception * @Description: * * @author: 王延飞 * @date: 2021/6/5 10:54 */ private static boolean isWeekEnd(DateTime dt) { boolean isWE = false; int wd = dt.dayOfWeek().get(); switch (wd) { case 6: case 7: isWE = true; break; default: break; } return isWE; } /** * @Title: 3、判断是否为国家法定节假日 * @MethodName: isHoliday * @param dt * @Return boolean * @Exception * @Description: * * @author: 王延飞 * @date: 2021/6/5 10:54 */ private static boolean isHoliday(DateTime dt) { boolean isHD = false; //TODO:get days from redis -- 存储国家法定节假日数据 List<String> holidayList = new ArrayList<String>(); if (holidayList != null) { for (String holiday : holidayList) { if (dt.isEqual(new DateTime(holiday))) { isHD = true; break; } } } return isHD; } /** * @Title: 4. 判断是否为国家调整后的工作日 * @MethodName: isSpWorkDay * @param dt * @Return boolean * @Exception * @Description: * * @author: 王延飞 * @date: 2021/6/5 10:56 */ private static boolean isSpWorkDay(DateTime dt) { boolean isSpWD = false; //TODO:get days from redis -- 国家调整后的工作日 List<String> spWorkDayList = new ArrayList<String>(); if (spWorkDayList != null) { for (String spWorkDay : spWorkDayList) { if (dt.isEqual(new DateTime(spWorkDay))) { isSpWD = true; break; } } } return isSpWD; } /** * 5、判断目标时间是否在区间内 * @param sDate 开始时间date/string * @param eDate 结束时间date/string * @param cDate 目标时间date/string * @param <T> * @return */ public static <T> boolean isInRange(T sDate, T eDate, T cDate) { DateTime dtLow = new DateTime(sDate); DateTime dtHigh = new DateTime(eDate); DateTime dt = new DateTime(cDate); if (dt.getMillis() >= dtLow.getMillis() && dt.getMillis() <= dtHigh.getMillis()) { return true; } return false; } /** * @param date * @param anotherDate * @return boolean * @Title: 6.判断两个日期(一个Date类型一个String类型)是否在同一天 * @methodName: isSameDay * @Description: * @author: 王延飞 * @date: 2017-05-02 20:19 */ public static boolean isSameDay(String date, String anotherDate) { boolean res = false; // 初始化时间 DateTime dateTime = new DateTime(); DateTime dt1 = new DateTime(date); DateTime dt2 = new DateTime(anotherDate); int intervalDays = Days.daysBetween(dt1, dt2).getDays(); if (intervalDays == 0) { res = true; } return res; } // ++++++++【查看月份、年份,星期】+++++++++ /** * @param date * @return String * @Title: 1.根据日期<Date>获得当前星期几 * @Description: * @author: 王延飞 * @date:2016年12月30日 下午8:22:23 */ public static String getWeekOfDate(Date date) { String[] weekDaysName = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; String[] weekDaysCode = {"0", "1", "2", "3", "4", "5", "6"}; Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int intWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1; return weekDaysName[intWeek]; } /** * @param date * @return String * @Title: 2.根据日期<String>获得【星期】 * @Description: * @author: 王延飞 * @date:2016年12月30日 下午8:50:35 */ public static String getWeekOfDateStr(String date) { // 返回值 String res = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(COMMON_PATTERN).parseDateTime(date); } // Get the day of week field value. int dayOfWeek = dateTime.getDayOfWeek(); switch (dayOfWeek) { case 1: res = "周一"; break; case 2: res = "周二"; break; case 3: res = "周三"; break; case 4: res = "周四"; break; case 5: res = "周五"; break; case 6: res = "周六"; break; case 7: res = "周日"; break; default: break; } return res; } /** * @param date * @return String * @Title: 3.根据日期<String>获得【月份】 * @Description: * @author: 王延飞 * @date:2016年12月30日 下午8:50:35 */ public static String getMonthOfDateStr(String date) { // 返回值 String res = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(COMMON_PATTERN).parseDateTime(date); } // Get the month of year field value int monthOfYear = dateTime.getMonthOfYear(); res = String.valueOf(monthOfYear); return res; } /** * @param date * @return String * @Title: 4.根据日期<String>获得【年份】 * @Description: * @author: 王延飞 * @date:2016年12月30日 下午8:50:35 */ public static String getYearOfDateStr(String date) { // 返回值 String res = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(COMMON_PATTERN).parseDateTime(date); } // Get the year field value. int year = dateTime.getYear(); res = String.valueOf(year); return res; } /** * @param date * @return java.lang.String * @Title: 5.根据日期<年份月份>获得【年份】 * @methodName: getYearOfYearMonth * @Description: * @author: 王延飞 * @date: 2017-01-23 14:47 */ public static String getYearOfYearMonth(String date) { // 返回值 String res = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(CN_YEAR_MONTH).parseDateTime(date); } // Get the year field value. int year = dateTime.getYear(); res = String.valueOf(year); return res; } /** * @param date * @return java.lang.String * @Title: 6.根据日期<年份月份>获得【月份】 * @methodName: getMonthOfYearMonth * @Description: * @author: 王延飞 * @date: 2017-01-23 14:50 */ public static String getMonthOfYearMonth(String date) { // 返回值 String res = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(CN_YEAR_MONTH).parseDateTime(date); } // Get the year field value. int monthOfYear = dateTime.getMonthOfYear(); res = String.valueOf(monthOfYear) + "月"; return res; } /** * @param date * @return String * @Title: 7.根据日期<String>获得【月-日】 * @Description: * @author: 王延飞 * @date:2016年12月30日 下午8:50:35 */ public static String getMonthAndDayOfDateStr(String date) { // 返回值 String res = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(COMMON_PATTERN).parseDateTime(date); } // Get the month of year field value int monthOfYear = dateTime.getMonthOfYear(); int dayOfMonth = dateTime.getDayOfMonth(); res = monthOfYear + "-" + dayOfMonth; return res; } /** * @param date * @return String * @Title: 8.根据日期<String>获得【年-月】 * @Description: * @author: 王延飞 * @date:2016年12月30日 下午8:50:35 */ public static String getYearAndMonthOfDateStr(String date) { // 返回值 String res = ""; String month = ""; DateTime dateTime = null; if (StringUtils.isNotBlank(date)) { dateTime = DateTimeFormat.forPattern(COMMON_PATTERN).parseDateTime(date); } // Get the year field value. int year = dateTime.getYear(); // Get the month of year field value int monthOfYear = dateTime.getMonthOfYear(); if (monthOfYear < 10) { month = "0" + monthOfYear; } else { month = String.valueOf(monthOfYear); } res = year + "年" + month + "月"; return res; } /** * @param * @return long * @Title: 9.当前时间的毫秒数 * @methodName: timestamp * @Description: * @author: 王延飞 * @date: 2018-06-21 17:28 */ public static long timestamp() { DateTime dateTime = new DateTime(); long millis = dateTime.getMillis(); return millis; } public static void main(String[] args) { // 获取当前系统时间 System.out.println("获取当前系统时间: "+getCurSysTime(null)); // 获取start到end的时间间隔 Date date = new Date(2006,0,10,22,19,35); ; Date date2 = new Date(2021,06,05,22,19,35); ; long years = getBetweenDate(date, date2, "YEARS"); System.out.println("获取start到end的时间间隔: "+years); Date add = add("2021-03-09", 10); System.out.println("加天数后的Date日期"+add); String abc = "2021-06-05"; boolean tradeDay = isTradeDay(abc); System.out.println("判断是否为交易日/工作日"+tradeDay); DateTime dateTime = new DateTime(date2); boolean weekEnd = isWeekEnd(dateTime); System.out.println("判断是否是周末"+weekEnd); } }
参考了其他的实现