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