package com.cnpc.dqhse.hazardcontrol.util;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.luaj.vm2.ast.Str;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* 日期范围
* 周 - (上周四-本周三)
* 月 - (上月21日-本月20日)
* 季度 - (按 去年12-21 - 本年03-20 为第一季度 以此类推)
* 年 - (去年12-21 - 本年12-20)
*
* @author gz
* @date 2024-10-30
*/
public class DqDateUtils extends org.apache.commons.lang3.time.DateUtils {
private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
/**
* 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
*/
public static String formatDate(Date date, Object... pattern) {
String formatDate = null;
if (pattern != null && pattern.length > 0) {
formatDate = DateFormatUtils.format(date, pattern[0].toString());
} else {
formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
}
return formatDate;
}
/**
* 得到当前年份字符串 格式(yyyy)
*/
public static String getYear() {
return formatDate(new Date(), "yyyy");
}
/**
* 日期型字符串转化为日期 格式
* { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
* "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
* "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
*/
public static Date parseDate(Object str) {
if (str == null) {
return null;
}
try {
return parseDate(str.toString(), parsePatterns);
} catch (ParseException e) {
return null;
}
}
public static String getDate(String date, String pattern) {
return DateFormatUtils.format(parseDate(date), pattern);
}
public static int dateToWeek() {
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
return cal.get(Calendar.DAY_OF_WEEK) - 1;
}
public static String previousWeek(int n, int week) {
Calendar cal = Calendar.getInstance();
//n为推迟的周数,1本周,-1向前推迟一周,2下周,依次类推
cal.add(Calendar.DATE, n * 7);
//想周几,这里就传几Calendar.MONDAY(TUESDAY...)
cal.set(Calendar.DAY_OF_WEEK, week);
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
}
//周
public static Map<String, String> getRangeWeeks() {
Map<String, String> map = new HashMap<>();
int curWeek = dateToWeek();
if (0 < curWeek && curWeek <= 3) {
map.put("start", previousWeek(-1, Calendar.THURSDAY));
map.put("end", previousWeek(0, Calendar.WEDNESDAY));
} else {
map.put("start", previousWeek(0, Calendar.THURSDAY));
map.put("end", previousWeek(1, Calendar.WEDNESDAY));
}
return map;
}
public static int dateToDay() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
return cal.get(Calendar.DAY_OF_MONTH);
}
public static String previousMonths(int n, int day) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, n);
cal.set(Calendar.DAY_OF_MONTH, day);
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
}
//月
public static Map<String, String> getRangeMonths() {
Map<String, String> map = new HashMap<>();
int curDay = dateToDay();
if (curDay <= 20) {
map.put("start", previousMonths(-1, 21));
map.put("end", previousMonths(0, 20));
} else {
map.put("start", previousMonths(0, 21));
map.put("end", previousMonths(1, 20));
}
return map;
}
/**
* @param nowTime 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return
* @author sunran 判断当前时间在时间区间内
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
public static String previousQuarters(int n, String year, String month, String day) {
Calendar cal = Calendar.getInstance();
cal.setTime(parseDate(year + "-" + month + "-" + day));
cal.add(Calendar.YEAR, n);
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
}
//季度-当前
public static Map<String, String> getRangeQuarters() {
Map<String, Map<String, String>> map = new HashMap<>();
Map<String, String> one = new HashMap<>();
one.put("start", previousQuarters(-1, getYear(), "12", "21"));
one.put("end", previousQuarters(0, getYear(), "3", "20"));
Map<String, String> two = new HashMap<>();
two.put("start", previousQuarters(0, getYear(), "3", "21"));
two.put("end", previousQuarters(0, getYear(), "6", "20"));
Map<String, String> three = new HashMap<>();
three.put("start", previousQuarters(0, getYear(), "6", "21"));
three.put("end", previousQuarters(0, getYear(), "9", "20"));
Map<String, String> four = new HashMap<>();
four.put("start", previousQuarters(0, getYear(), "9", "21"));
four.put("end", previousQuarters(0, getYear(), "12", "20"));
map.put("one", one);
map.put("two", two);
map.put("three", three);
map.put("four", four);
for (String key : map.keySet()) {
if (isEffectiveDate(new Date(), parseDate(map.get(key).get("start")), parseDate(map.get(key).get("end")))) {
return map.get(key);
}
}
Map<String, String> last = new HashMap<>();
last.put("start", previousQuarters(0, getYear(), "12", "21"));
last.put("end", previousQuarters(1, getYear(), "3", "20"));
return last;
}
//季度
public static List<Map<String, String>> getQueryQuarterAll() {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> one = new HashMap<>();
one.put("start", previousQuarters(-1, getYear(), "12", "21"));
one.put("end", previousQuarters(0, getYear(), "3", "20"));
one.put("quarter", "1");
Map<String, String> two = new HashMap<>();
two.put("start", previousQuarters(0, getYear(), "3", "21"));
two.put("end", previousQuarters(0, getYear(), "6", "20"));
two.put("quarter", "2");
Map<String, String> three = new HashMap<>();
three.put("start", previousQuarters(0, getYear(), "6", "21"));
three.put("end", previousQuarters(0, getYear(), "9", "20"));
three.put("quarter", "3");
Map<String, String> four = new HashMap<>();
four.put("start", previousQuarters(0, getYear(), "9", "21"));
four.put("end", previousQuarters(0, getYear(), "12", "20"));
four.put("quarter", "4");
list.add(one);
list.add(two);
list.add(three);
list.add(four);
return list;
}
public static Map<String, String> getRangeYears() {
Map<String, String> map = new HashMap<>();
String start = previousQuarters(-1, getYear(), "12", "21");
String end = previousQuarters(0, getYear(), "12", "20");
if (isEffectiveDate(new Date(), parseDate(start), parseDate(end))) {
map.put("start", start);
map.put("end", end);
} else {
map.put("start", previousQuarters(0, getYear(), "12", "21"));
map.put("end", previousQuarters(1, getYear(), "12", "20"));
}
return map;
}
/**
* 获取两个日期之间的所有月份 (年月)
*
* @param startTime
* @param endTime
* @return:YYYY-MM
*/
public static List<String> getMonthBetweenDate(String startTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 声明保存日期集合
List<String> list = new ArrayList<String>();
try {
// 转化成日期类型
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
//用Calendar 进行日期比较判断
Calendar calendar = Calendar.getInstance();
while (startDate.getTime() <= endDate.getTime()) {
// 把日期添加到集合
list.add(sdf.format(startDate));
// 设置日期
calendar.setTime(startDate);
//把日期增加一天
calendar.add(Calendar.MONTH, 1);
// 获取增加后的日期
startDate = calendar.getTime();
}
} catch (ParseException e) {
e.printStackTrace();
}
return list;
}
//年
public static List<Map<String, String>> getQueryYearAll() {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> rangeYears = getRangeYears();
List<String> months = getMonthBetweenDate(rangeYears.get("start"), rangeYears.get("end"));
for (int i = 0; i < months.size() - 1; i++) {
Map<String, String> m = new HashMap<>();
m.put("range", getDate(months.get(i + 1), "yyyy-MM"));
m.put("start", months.get(i) + "-21");
m.put("end", months.get(i + 1) + "-20");
list.add(m);
}
return list;
}
/**
* 根据传入的时间取月份范围
* {start=2023-09-21, end=2023-10-20}
*/
public static Map<String, String> getRangeMonthsByParam(String date) {
Map<String, String> map = new HashMap<>();
Calendar cal = Calendar.getInstance();
cal.setTime(parseDate(date));
int curDay = cal.get(Calendar.DAY_OF_MONTH);
if (curDay <= 20) {
map.put("start", previousMonthsByParam(date,-1, 21));
map.put("end", previousMonthsByParam(date,0, 20));
} else {
map.put("start", previousMonthsByParam(date,0, 21));
map.put("end", previousMonthsByParam(date,1, 20));
}
return map;
}
public static String previousMonthsByParam(String date,int n, int day) {
Calendar cal = Calendar.getInstance();
cal.setTime(parseDate(date));
cal.add(Calendar.MONTH, n);
cal.set(Calendar.DAY_OF_MONTH, day);
return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
}
/**
* 根据传入的范围内时间_取所有的月份和月份范围
* [{start=2023-09-21, range=2023-10, end=2023-10-20}]
*/
public static List<Map<String, String>> getQueryAllMonthByParam(String startTime, String endTime) {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> startTimeMap = getRangeMonthsByParam(startTime);
Map<String, String> endTimeMap = getRangeMonthsByParam(endTime);
List<String> months = getMonthBetweenDate(startTimeMap.get("start"), endTimeMap.get("end"));
for (int i = 0; i < months.size() - 1; i++) {
String a = months.get(i);
Map<String, String> m = new HashMap<>();
m.put("range", getDate(months.get(i + 1), "yyyy-MM"));
m.put("start", months.get(i) + "-21");
m.put("end", months.get(i + 1) + "-20");
list.add(m);
}
return list;
}
/**
* 根据年份,几季度,取季度范围
* @param year
* @param quarter
* @return
*/
public static Map<String, String> getRangeQuartersByYear(String year,String quarter) {
Map<String, Map<String, String>> map = new HashMap<>();
String year_ = year;
Map<String, String> one = new HashMap<>();
one.put("start", previousQuarters(-1, year_, "12", "21"));
one.put("end", previousQuarters(0, year_, "3", "20"));
one.put("quarter", "1");
one.put("year", year_);
Map<String, String> two = new HashMap<>();
two.put("start", previousQuarters(0, year_, "3", "21"));
two.put("end", previousQuarters(0, year_, "6", "20"));
two.put("quarter", "2");
two.put("year", year_);
Map<String, String> three = new HashMap<>();
three.put("start", previousQuarters(0, year_, "6", "21"));
three.put("end", previousQuarters(0, year_, "9", "20"));
three.put("quarter", "3");
three.put("year", year_);
Map<String, String> four = new HashMap<>();
four.put("start", previousQuarters(0, year_, "9", "21"));
four.put("end", previousQuarters(0, year_, "12", "20"));
four.put("quarter", "4");
four.put("year", year_);
map.put("one", one);
map.put("two", two);
map.put("three", three);
map.put("four", four);
Map<String, String> last = new HashMap<>();
if(ObjectUtils.isNotEmpty(quarter)){
for (String key : map.keySet()) {
if (quarter.equals(map.get(key).get("quarter"))) {
last = map.get(key);
}
}
}else {
last.put("start", previousQuarters(-1, year_, "12", "21"));
last.put("end", previousQuarters(0, year_, "12", "20"));
}
return last;
}
/**
* 根据年参数,获取当前年的所有季度以及季度范围
* @param year
* @return
*/
public static List<Map<String, String>> getQueryQuarterAllByYear(String year) {
List<Map<String, String>> list = new ArrayList<>();
String year_ = year;
Map<String, String> one = new HashMap<>();
one.put("start", previousQuarters(-1, year_, "12", "21"));
one.put("end", previousQuarters(0, year_, "3", "20"));
one.put("quarter", "1");
one.put("year", year_);
Map<String, String> two = new HashMap<>();
two.put("start", previousQuarters(0, year_, "3", "21"));
two.put("end", previousQuarters(0, year_, "6", "20"));
two.put("quarter", "2");
two.put("year", year_);
Map<String, String> three = new HashMap<>();
three.put("start", previousQuarters(0, year_, "6", "21"));
three.put("end", previousQuarters(0, year_, "9", "20"));
three.put("quarter", "3");
three.put("year", year_);
Map<String, String> four = new HashMap<>();
four.put("start", previousQuarters(0, year_, "9", "21"));
four.put("end", previousQuarters(0, year_, "12", "20"));
four.put("quarter", "4");
four.put("year", year_);
list.add(one);
list.add(two);
list.add(three);
list.add(four);
return list;
}
public static int returnYearByTime(String date){
Calendar cal = Calendar.getInstance();
cal.setTime(parseDate(date));
int curYear = cal.get(Calendar.YEAR);
return curYear;
}
/**
* 根据时间范围取——季度以及季度的范围
* @param startTime
* @param endTime
* @return
*/
public static List<Map<String, String>> getQueryQuarterAllByTime(String startTime, String endTime) {
List<Map<String, String>> resultlist = new ArrayList<>();
List<Map<String, String>> listMonth = getQueryAllMonthByParam(startTime,endTime); //所有的月份
int startYear = returnYearByTime(startTime);
int endYear = returnYearByTime(endTime);
List<Map<String, String>> startYearList = new ArrayList<>();
List<Map<String, String>> endYearMapList = new ArrayList<>();
if(startYear == endYear){
startYearList = getQueryQuarterAllByYear(startYear + "");
}else {
startYearList = getQueryQuarterAllByYear(startYear + "");
endYearMapList = getQueryQuarterAllByYear(endYear + "");
}
if(ObjectUtils.isNotEmpty(startYearList)){
for(Map<String, String> quarterMap : startYearList){
for(Map<String, String> monthMap :listMonth) {
String startMonthTime = monthMap.get("start");
String endMonthTime = monthMap.get("end");
if (isEffectiveDate(parseDate(startMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))
|| isEffectiveDate(parseDate(endMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))) {
resultlist.add(quarterMap);
}
}
}
}
if(ObjectUtils.isNotEmpty(endYearMapList)){
for(Map<String, String> quarterMap : endYearMapList){
for(Map<String, String> monthMap :listMonth) {
String startMonthTime = monthMap.get("start");
String endMonthTime = monthMap.get("end");
if (isEffectiveDate(parseDate(startMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))
|| isEffectiveDate(parseDate(endMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))) {
resultlist.add(quarterMap);
}
}
}
}
List<Map<String, String>> resultList_ = resultlist.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.get("start")+f.get("end")))), ArrayList::new));
return resultList_;
}
public static void main(String[] args) {
//[{start=2024-02-21, range=2024-03, end=2024-03-20}, {start=2024-03-21, range=2024-04, end=2024-04-20}, {start=2024-04-21, range=2024-05, end=2024-05-20}, {start=2024-05-21, range=2024-06, end=2024-06-20}]
System.out.println(getQueryAllMonthByParam("2024-03-10","2025-02-23"));
//[{year=2024, start=2023-12-21, end=2024-03-20, quarter=1}, {year=2024, start=2024-03-21, end=2024-06-20, quarter=2}]
System.out.println(getQueryQuarterAllByTime("2024-03-10","2025-02-23"));
System.out.println(returnYearByTime("2023-09-25"));
//{start=2023-03-21, end=2023-06-20, quarter=2}
System.out.println(getRangeQuartersByYear("2023","2"));
//{start=2022-12-21, end=2023-12-20}
System.out.println(getRangeQuartersByYear("2024",""));
System.out.println(getRangeMonthsByParam("2023-09-25")); //当前月份
System.out.println(getQueryAllMonthByParam("2023-09-25","2025-04-23"));//所有月份
System.out.println(getQueryYearAll());
System.out.println(getRangeYears());
System.out.println(getQueryQuarterAll());
System.out.println(getRangeQuarters());
System.out.println(getRangeMonths());
System.out.println(getRangeWeeks());
}
}
年月季度以及范围的日期类
猜你喜欢
转载自blog.csdn.net/u011518709/article/details/143426005
今日推荐
周排行