基于joda:日期时间工具类

简介: 基于joda:日期时间工具类


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);
    }
}

参考了其他的实现



目录
相关文章
|
6月前
|
Java API
Java一分钟之-Java日期与时间API:LocalDate, LocalDateTime
【5月更文挑战第13天】Java 8引入`java.time`包,改进日期时间API。`LocalDate`代表日期,`LocalDateTime`包含日期和时间。本文概述两者的基本用法、常见问题及解决策略。创建日期时间使用`of()`和`parse()`,操作日期时间有`plusDays()`、`minusMonths()`等。注意点包括:设置正确的`DateTimeFormatter`,考虑闰年影响,以及在需要时区信息时使用`ZonedDateTime`。正确使用这些类能提升代码质量。
121 3
|
6月前
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
6月前
DateUtil工具类
DateUtil工具类
35 0
|
Java
Java:joda-time处理时间对象
Java:joda-time处理时间对象
70 0
|
Java API 数据库
Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面
Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面
161 0
Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面
|
Java
Java 1.8 日期处理更方便 Time 包的LocalDateTime、LocalDate、ZonedDateTime 和Date
看到java 1.8有处理日期理方便的方法,从此可以告别以前那种获取日期的年、月、日的复杂写法 这时记录一下,方便后面查询使用
212 0
Java(九):LocalDate和LocalDateTime时间处理
Java(九):LocalDate和LocalDateTime时间处理
212 0
|
存储 安全 Java
11.4 Java 日期和时间类
我们先来看一些基本概念,然后再介绍 Java 的日期和时间 API。关于日期和时间,有一些基本概念,包括时区、时刻、纪元时、年历等。 全球一共有 24 个时区,英国格林尼治是 0 时区,北京是东八区,也就是说格林尼治凌晨 1 点,北京是早上 9 点。0 时区的时间也称为 GMT+0 时间,GMT 是格林尼治标准时间,北京的时间就是 GMT+8:00。 所有计算机系统内部都用一个整数表示时刻,这个整数是距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。为什么要用这个时间呢?更多的是历史原因。 格林尼治标准时间 1970年1月1日0时0分0秒也被称为 Epoch Time(纪元时)
284 0