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);
}
}
参考了其他的实现