All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cntool.core.date.ToolMethods Maven / Gradle / Ivy

The newest version!
package com.cntool.core.date;

import com.cntool.core.string.StrUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;

/**
 * {@code @program:} cn-tool
 * {@code @description:} 工具类中使用的方法
 * {@code @author:} ID-Tang
 * {@code @create:} 2022-01-17 11:34
 * {@code @copyright:} Copyright (c) [2022] [ID-tang]
 * [cntool] is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 * ...
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 **/
enum ToolState {
    /**
     * 日
     */
    DAY,
    /**
     * 月
     */
    MONTH,
    /**
     * 年
     */
    YEAR
}

class ToolMethods extends PrivateMethod {
    /**
     * 用于处理返回值
     * 该方法用于处理返回参数为字符串类型的
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @return 年-月 例:2022-01
     */
    static String yearToStrCalendar(Date timeData, String strTimeData, Integer len, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(null == pattern ? PATTERN : pattern);
        return sdf.format(getCalendar(timeData, strTimeData, len, pattern, sdf, ToolState.YEAR).getTime());
    }

    /**
     * 用于处理返回值
     * 该方法用于处理返回参数为Date类型的
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @return 年-月 例:2022-01
     */
    static Date yearToDateCalendar(Date timeData, String strTimeData, Integer len, String pattern) {
        return getCalendar(timeData, strTimeData, len, pattern, null, ToolState.YEAR).getTime();
    }

    /**
     * 用于处理返回值
     * 该方法用于处理返回参数为字符串类型的
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @return 年-月 例:2022-01
     */
    static String monthToStrCalendar(Date timeData, String strTimeData, Integer len, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(null == pattern ? PATTERN : pattern);
        return sdf.format(getCalendar(timeData, strTimeData, len, pattern, sdf, ToolState.MONTH).getTime());
    }

    /**
     * 用于处理返回值
     * 该方法用于处理返回参数为Date类型的
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @return 年-月 例:2022-01
     */
    static Date monthToDateCalendar(Date timeData, String strTimeData, Integer len, String pattern) {
        return getCalendar(timeData, strTimeData, len, pattern, null, ToolState.MONTH).getTime();
    }

    /**
     * 用于处理返回值
     * 该方法用于处理返回参数为字符串类型的
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @return 年-月 例:2022-01
     */
    static String dayToStrCalendar(Date timeData, String strTimeData, Integer len, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(null == pattern ? PATTERN : pattern);
        return sdf.format(getCalendar(timeData, strTimeData, len, pattern, sdf, ToolState.DAY).getTime());
    }

    /**
     * 用于处理返回值
     * 该方法用于处理返回参数为Date类型的
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @return 年-月 例:2022-01
     */
    static Date dayToDateCalendar(Date timeData, String strTimeData, Integer len, String pattern) {
        return getCalendar(timeData, strTimeData, len, pattern, null, ToolState.DAY).getTime();
    }

    /**
     * 判断当前日期是否在指定日期段内
     * 此方法可以用来判断两种格式的日期
     * 例1:开始时间:2022-01-20 结束时间:2022-01-19
     * 例2:开始时间:10 结束时间:1
     *
     * @param begin  开始日期
     * @param end    结束日期
     * @param isThis 是否是本月
     * @return true在 false不在
     */
    static Boolean nowIsInSection(String begin, String end, Boolean isThis) {
        boolean length = 10 == begin.length() && 10 == end.length();
        if (!length && 2 < begin.length()) {
            System.out.println("\t\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>异常提示:日期格式错误!!\t");
            return false;
        }
        //使用默认时区和语言环境获得一个日历。
        Calendar cal = Calendar.getInstance();
        //时间模板类
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //现在时间
        Date now;
        //开始时间
        Date beginDay;
        //结束时间
        Date endDay;
        try {
            String nowStr = sdf.format(cal.getTime());
            now = sdf.parse(nowStr);
            if (length) {
                beginDay = sdf.parse(begin);
                endDay = sdf.parse(end);
                return now.before(endDay) && now.after(beginDay) || now.equals(beginDay) || now.equals(endDay);
            }
            if (isThis) {
                return isInSection(cal, begin, end, now, true);
            }
            cal.add(Calendar.MONTH, -1);
            boolean one = isInSection(cal, begin, end, now, false);
            boolean two = isInSection(cal, begin, end, now, false);
            return one || two;
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 判断当前时间是否在指定时间段内
     *
     * @param beginTimeStr 起始时间,格式应与format匹配
     * @param endTimeStr   结束时间,格式应与format匹配
     * @param format       时间格式,如HH:mm:ss
     * @return boolean true在 false不在
     */
    static boolean nowIsInTime(String beginTimeStr, String endTimeStr, String format) {
        if (StrUtils.isBlank(beginTimeStr) || StrUtils.isBlank(endTimeStr)) {
            System.out.println("\t\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>异常提示:参数缺失!!\t");
            return false;
        }

        SimpleDateFormat df = new SimpleDateFormat(format);
        Date nowTime = null;
        Date beginTime = null;
        Date endTime = null;
        try {
            nowTime = df.parse(df.format(new Date()));
            beginTime = df.parse(beginTimeStr);
            endTime = df.parse(endTimeStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Calendar date = Calendar.getInstance();
        date.setTime(Objects.requireNonNull(nowTime));

        Calendar begin = Calendar.getInstance();
        begin.setTime(Objects.requireNonNull(beginTime));

        Calendar end = Calendar.getInstance();
        end.setTime(Objects.requireNonNull(endTime));

        return date.after(begin) && date.before(end) || date.equals(begin);
    }
}


class PrivateMethod {
    final static String PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 用于处理返回值
     * 该方法返回值为Calendar
     * 接收到返回值后需要自己进行格式化
     *
     * @param timeData    Date类型的指定开始日期
     * @param strTimeData String类型的指定开始日期
     * @param len         要推的月数 例:往前推一个月 -1
     * @param pattern     格式化模板 例:yyyy-MM
     * @param sdf         SimpleDateFormat 为空时该方法会进行创建 不为空时直接使用传入的
     * @return Calendar
     */
    static Calendar getCalendar(Date timeData, String strTimeData, Integer len, String pattern,
                                SimpleDateFormat sdf, ToolState state) {
        sdf = null == sdf ? new SimpleDateFormat(null == pattern ? PATTERN : pattern) : sdf;
        Calendar cal = Calendar.getInstance();
        if (null == timeData && null == strTimeData) {
            cal.setTime(new Date());
        } else if (null == timeData) {
            try {
                cal.setTime(sdf.parse(strTimeData));
            } catch (ParseException e) {
                System.out.println("\n\t异常提示 >>>>>>>>>>>>>>>>>>>>> 日期长度与格式化长度不匹配,建议调整为互相匹配的格式!\n");
            }
        } else if (null == strTimeData) {
            cal.setTime(timeData);
        }

        switch (state) {
            case YEAR:
                cal.add(Calendar.YEAR, null == len ? 0 : len);
                break;
            case MONTH:
                cal.add(Calendar.MONTH, null == len ? 0 : len);
                break;
            case DAY:
                cal.add(Calendar.DATE, null == len ? 0 : len);
                break;
            default:
                break;
        }
        return cal;
    }

    /**
     * 获取是否在区间内
     * 此方法可以用来判断跨月份
     * 例:开始日期:5 结束日期:3
     *
     * @param cal    日历类
     * @param begin  开始日期
     * @param end    结束日期
     * @param now    现在时间
     * @param isThis 关闭日期是否本月 true本月 false下月
     * @return true 在区间内 false不在区间内
     * @throws ParseException 时间转换异常
     */
    static boolean isInSection(Calendar cal, String begin, String end,
                               Date now, boolean isThis) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String nowStr = sdf.format(cal.getTime());
        begin = Integer.parseInt(begin) < 10 ? "0" + begin : begin;
        Date beginDay = sdf.parse(nowStr.substring(0, 8) + begin);
        cal.add(Calendar.MONTH, isThis ? 0 : 1);
        nowStr = sdf.format(cal.getTime());
        end = Integer.parseInt(end) < 10 ? "0" + end : end;
        Date endDay = sdf.parse(nowStr.substring(0, 8) + end);
        return now.before(endDay) && now.after(beginDay) || now.equals(beginDay) || now.equals(endDay);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy