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

参考了其他的实现



相关文章
Springboot接口同时支持GET和POST请求
Springboot接口同时支持GET和POST请求
1392 0
|
机器学习/深度学习
YOLOv5改进 | 2023注意力篇 | MLCA混合局部通道注意力(轻量化注意力机制)
YOLOv5改进 | 2023注意力篇 | MLCA混合局部通道注意力(轻量化注意力机制)
857 0
|
关系型数据库 PostgreSQL 索引
PostgreSQL 11 新特性解读:分区表支持创建主键、外键、索引
PostgreSQL 10 版本虽然支持创建范围分区表和列表分区表,但创建过程依然比较繁琐,需要手工定义子表索引、主键,详见 PostgreSQL10:重量级新特性-支持分区表,PostgreSQL 11 版本得到增强,在父表上创建索引、主键、外键后,子表上将自动创建,本文演示这三种场景。
7701 0
|
7月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
925 16
|
12月前
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案
675 3
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
|
Java 数据库连接 数据库
Mybatis逆向工程笔记小结
Mybatis逆向工程笔记小结
|
Prometheus Cloud Native
grafana展示的CPU利用率与实际不符的问题探究
grafana展示的CPU利用率与实际不符的问题探究
256 2
|
数据采集 自然语言处理 算法
实战RAG:构建基于检索增强的问答系统
【10月更文挑战第21天】在当今大数据时代,如何高效地从海量信息中获取所需知识,成为一个亟待解决的问题。检索增强的生成模型(Retrieval-Augmented Generation, RAG)应运而生,它结合了检索技术和生成模型的优点,旨在提高生成模型的回答质量和准确性。作为一名热衷于自然语言处理(NLP)领域的开发者,我有幸在多个项目中应用了RAG技术,并取得了不错的成效。本文将从我个人的实际经验出发,详细介绍如何使用RAG技术来构建一个问答系统,希望能够帮助那些已经对RAG有一定了解并希望将其应用于实际项目中的开发者们。
985 1
|
存储 SQL 前端开发
瑞吉外卖精华部分总结(1)
瑞吉外卖精华部分总结(1)
447 0
|
消息中间件 存储 算法
RocketMQ学习笔记
RocketMQ学习笔记
359 0