2025-04-25 18:09:21 +08:00

830 lines
30 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.zhgd.xmgl.util;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @program: wisdomSite
* @description: 日期格式
* @author: Mr.Peng
* @create: 2020-12-15 17:05
**/
@Slf4j
public class DateUtils {
/**
* 验证日期段格式日期格式yyyy-MM-dd 或 yyyy/MM/dd 或 yyyy.MM.dd 或 yyyy年MM月dd日分割符号到——~至—
*
* @param input
* @return
*/
public static boolean validateDateRange(String input) {
if (StrUtil.isBlank(input)) {
return true;
}
return parseDateRange(input) != null;
}
/**
* 解析日期段格式日期格式yyyy-MM-dd 或 yyyy/MM/dd 或 yyyy.MM.dd 或 yyyy年MM月dd日分割符号到——~至—
*
* @param input
* @return
*/
public static List<Date> parseDateRange(String input) {
input = StrUtil.trim(input);
String regex = "^\\s*" +
"(?:" +
// 标准格式yyyy-MM-dd 或 yyyy/MM/dd 或 yyyy.MM.dd
"(?<stdStartY>\\d{4})[-/.]?(?<stdStartM>\\d{1,2})[-/.]?(?<stdStartD>\\d{1,2})" +
"|" +
// 中文格式yyyy年MM月dd日
"(?<cnStartY>\\d{4})\\s*年\\s*(?<cnStartM>\\d{1,2})\\s*月\\s*(?<cnStartD>\\d{1,2})\\s*日" +
")" +
"\\s*" +
// 分隔符
"(?<sep>到|至|——|—|~|--+)" +
"\\s*" +
"(?:" +
// 标准格式结束日期
"(?<stdEndY>\\d{4})[-/.]?(?<stdEndM>\\d{1,2})[-/.]?(?<stdEndD>\\d{1,2})" +
"|" +
// 中文格式结束日期
"(?<cnEndY>\\d{4})\\s*年\\s*(?<cnEndM>\\d{1,2})\\s*月\\s*(?<cnEndD>\\d{1,2})\\s*日" +
")" +
"\\s*$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
try {
// 解析开始日期
int startYear, startMonth, startDay;
if (matcher.group("stdStartY") != null) {
// 标准格式
startYear = Integer.parseInt(matcher.group("stdStartY"));
startMonth = Integer.parseInt(matcher.group("stdStartM"));
startDay = Integer.parseInt(matcher.group("stdStartD"));
} else {
// 中文格式
startYear = Integer.parseInt(matcher.group("cnStartY"));
startMonth = Integer.parseInt(matcher.group("cnStartM"));
startDay = Integer.parseInt(matcher.group("cnStartD"));
}
// 解析结束日期
int endYear, endMonth, endDay;
if (matcher.group("stdEndY") != null) {
// 标准格式
endYear = Integer.parseInt(matcher.group("stdEndY"));
endMonth = Integer.parseInt(matcher.group("stdEndM"));
endDay = Integer.parseInt(matcher.group("stdEndD"));
} else {
// 中文格式
endYear = Integer.parseInt(matcher.group("cnEndY"));
endMonth = Integer.parseInt(matcher.group("cnEndM"));
endDay = Integer.parseInt(matcher.group("cnEndD"));
}
LocalDate startDate = LocalDate.of(startYear, startMonth, startDay);
LocalDate endDate = LocalDate.of(endYear, endMonth, endDay);
return Arrays.asList(Date.from(startDate.atStartOfDay(ZoneId.systemDefault()).toInstant()), Date.from(endDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
} catch (Exception e) {
log.error("", e);
return null; // 处理无效日期
}
}
return null;
}
public static void main(String[] args) {
String[] testCases = {
"2020-10-10到2020-10-11",
"2020年10月10日——2020年10月11日",
"2020/10/10~2020/10/11",
"2020 年 1 月 5 日 至 2020 年 1 月 6 日",
"2020.12.31—2021.01.01"
};
for (String testCase : testCases) {
List<Date> dates = parseDateRange(testCase);
if (dates != null) {
System.out.printf("输入: '%s'\n开始日期: %s\n结束日期: %s\n\n", testCase, dates.get(0), dates.get(1));
} else {
System.out.printf("输入: '%s' 解析失败\n\n", testCase);
}
}
}
public static String dealDateFormat(String oldDate) {
Date date1 = null;
SimpleDateFormat df2 = null;
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = df.parse(oldDate);
Calendar beijingcal = Calendar.getInstance();
beijingcal.setTime(date);
beijingcal.set(Calendar.HOUR, beijingcal.get(Calendar.HOUR) + 8);
date1 = beijingcal.getTime();
df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} catch (ParseException e) {
log.error("error", e);
}
return df2.format(date1);
}
public static String parseDateFormat(String oldDate) {
Date date = null;
SimpleDateFormat df2 = null;
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
date = df.parse(oldDate);
df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
} catch (ParseException e) {
log.error("error", e);
}
return df2.format(date);
}
public static List<String> getNowWeekAllDayList() {
Calendar cal = Calendar.getInstance();
// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
// 获得当前日期是一个星期的第几天
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
// log.info("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
return findDates(cal.getTime(), new Date());
}
/**
* 查询现在时间几天前到现在之间的所有日期
*
* @param days
* @return
*/
public static List<String> getOtherDayAllDayList(int days) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -days);
return findDates(cal.getTime(), new Date());
}
public static List<String> getNowMonthAllDayList() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);
return findDates(cal.getTime(), new Date());
}
/**
* 获取两个时间段所有天数2024-01-01到2024-01-02...到2025-01-01
*
* @param beginTime 2024-01-01
* @param endTime 2025-01-01
* @return
*/
public static List<String> getDiffTimeDayList(String beginTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return findDates(sdf.parse(beginTime), sdf.parse(endTime));
} catch (ParseException e) {
log.error("error", e);
}
return null;
}
public static List<String> findDates(Date dBegin, Date dEnd) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List lDate = new ArrayList();
lDate.add(sdf.format(dBegin));
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calEnd.setTime(dEnd);
// 测试此日期是否在指定日期之后
while (dEnd.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
if (calBegin.getTimeInMillis() <= dEnd.getTime()) {
lDate.add(sdf.format(calBegin.getTime()));
}
}
return lDate;
}
/**
* 获取指定年份所有天数
*
* @param yearMonth
* @return
*/
public static List<String> getYearAllMonthList(String yearMonth) {
String year = yearMonth.substring(0, 4);
List<String> list = new ArrayList<>();
for (int i = 1; i <= 12; i++) {
if (i < 10) {
list.add(year + "0" + i);
} else {
list.add(year + i);
}
}
return list;
}
/**
* @param yearMonth 月份格式yyyy-MM
* @return
*/
public static List<String> getMonthDayList(String yearMonth) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
//判断是否是当月
if (yearMonth.equals(sdf.format(new Date()))) {
return getNowMonthAllDayList();
} else {
return getDayListOfMonth(yearMonth);
}
}
public static List<String> getDayListOfMonth(String yearMonth) {
int year = Integer.parseInt(yearMonth.split("-")[0]); //年
int month = Integer.parseInt(yearMonth.split("-")[1]); //月
Calendar endCal = Calendar.getInstance();
// 设置年份
endCal.set(Calendar.YEAR, year);
// 设置月份
endCal.set(Calendar.MONTH, month - 1);
// 获取某月最大天数
int lastDay = endCal.getActualMaximum(Calendar.DATE);
// 设置日历中月份的最大天数
endCal.set(Calendar.DAY_OF_MONTH, lastDay);
Calendar startCal = Calendar.getInstance();
// 设置年份
startCal.set(Calendar.YEAR, year);
// 设置月份
startCal.set(Calendar.MONTH, month - 1);
//获取某月最小天数
int firstDay = startCal.getActualMinimum(Calendar.DAY_OF_MONTH);
//设置日历中月份的最小天数
startCal.set(Calendar.DAY_OF_MONTH, firstDay);
return findDates(startCal.getTime(), endCal.getTime());
}
/**
* 获取当前周第一天日期
*
* @return
*/
public static String getNowWeekStartTime() {
Calendar cal = Calendar.getInstance();
// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
// 获得当前日期是一个星期的第几天
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
// log.info("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(cal.getTime());
}
public static List<String> getDiffTimeYearList(String beginTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return findYear(sdf.parse(beginTime), sdf.parse(endTime));
} catch (ParseException e) {
log.error("error", e);
}
return null;
}
public static List<String> findYear(Date dBegin, Date dEnd) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
List lDate = new ArrayList();
lDate.add(sdf.format(dBegin));
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calEnd.setTime(dEnd);
// 测试此日期是否在指定日期之后
while (dEnd.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.YEAR, 1);
if (calBegin.getTimeInMillis() <= dEnd.getTime()) {
lDate.add(sdf.format(calBegin.getTime()));
}
}
return lDate;
}
public static List<String> getDiffTimeMonthList(String beginTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return findMonth(sdf.parse(beginTime), sdf.parse(endTime));
} catch (ParseException e) {
log.error("error", e);
}
return null;
}
public static List<String> findMonth(Date dBegin, Date dEnd) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
List lDate = new ArrayList();
lDate.add(sdf.format(dBegin));
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calEnd.setTime(dEnd);
// 测试此日期是否在指定日期之后
while (dEnd.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.MONTH, 1);
if (calBegin.getTimeInMillis() <= dEnd.getTime()) {
lDate.add(sdf.format(calBegin.getTime()));
}
}
return lDate;
}
public static List<String> getDiffTimeWeekList(String beginTime, String endTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(beginTime, formatter);
LocalDate endDate = LocalDate.parse(endTime, formatter);
List<String> lDate = new ArrayList();
while (endDate.isAfter(startDate)) {
String start = startDate.format(formatter);
if (startDate.getDayOfWeek() == DayOfWeek.SUNDAY) {
lDate.add(start + "/" + start);
} else {
LocalDate sunday = startDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
if (sunday.isAfter(endDate)) {
lDate.add(start + "/" + endDate.format(formatter));
} else {
lDate.add(start + "/" + sunday.format(formatter));
}
}
startDate = startDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)).plusDays(1);
}
return lDate;
}
/**
* 获取当前时间和当天时间几天前之间的所有天数
*
* @param dayNum 当天时间以前具体几天
* @return
*/
public static List<String> getNowFewDaysAgoList(int dayNum) {
try {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -dayNum);
Date date = calendar.getTime();
return findDates(date, new Date());
} catch (Exception e) {
log.error("error", e);
}
return null;
}
/**
* @param type 1 今日24 小时2本周所有天3本月所有天
* @return
*/
public static List<String> getDayList(Integer type) {
if (type == 1) {
List<String> list = new ArrayList<>();
for (int i = 0; i <= 23; i++) {
list.add(i + "");
}
return list;
} else if (type == 2) {
return getDateTimeStrList(60, "yyyy-MM-dd");
} else if (type == 3) {
return getNowMonthAllDayList();
}
return null;
}
/**
* 比较两个日期大小
*
* @param time1
* @param time2
* @return
* @throws ParseException
*/
public static boolean compareTime(String time1, String time2) {
try {
//如果想比较日期则写成"yyyy-MM-dd"就可以了
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将字符串形式的时间转化为Date类型的时间
Date a = sdf.parse(time1);
Date b = sdf.parse(time2);
//Date类的一个方法如果a早于b返回true否则返回false
//a时间下雨b时间返回true,否正返回false
if (a.before(b)) {
return true;
} else {
return false;
}
} catch (Exception e) {
log.error("error", e);
}
return false;
}
/**
* 查询当前时间指定天数之前的日期
*
* @param @param days
* @param @return 参数
* @return String 返回类型
* @throws
* @Title: getBeginDayTime
*/
public static String getBeginDayTime(int days) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -days);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(cal.getTime());
}
/**
* 转成GMT时间
*
* @param date
*/
public static String getGMTTime(Date date) {
DateFormat dateFormat = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.format(date);
}
/**
* 查询N天前的所有天数2023-06-10到2023-06-15
*
* @return
*/
public static List<String> getDaysBefore(int days) {
ArrayList<String> rtList = new ArrayList<>();
DateTime dateTime = DateUtil.parseDate(DateUtil.today());
for (int i = 0; i < days; i++) {
rtList.add(DateUtil.formatDate(DateUtil.offsetDay(dateTime, i * (-1))));
}
Collections.reverse(rtList);
return rtList;
}
/**
* 查询指定天数内所有天数列表, 返回:如:[07-30, 07-31]
*
* @param queryStartTime 2023-07-31
* @param queryEndTime 2023-07-31
* @return
*/
public static List<String> getBetweenDays(String queryStartTime, String queryEndTime, String format) {
ArrayList<String> rtList = new ArrayList<>();
DateTime beginDate = DateUtil.parseDate(queryStartTime);
DateTime endDate = DateUtil.parseDate(queryEndTime);
long offset = DateUtil.betweenDay(beginDate, endDate, true);
for (int i = 0; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), format));
}
return rtList;
}
/**
* 偏移日期str传入2023-11-02返回2023-11-02传入2023-11-02 00:00:00返回2023-11-02 00:00:00
*
* @param dayStr
* @param offset
* @return
*/
public static String offsetDayStr(String dayStr, int offset) {
if (dayStr.length() == 10) {
return DateUtil.formatDate(DateUtil.offsetDay(DateUtil.parse(dayStr), offset));
} else {
return DateUtil.format(DateUtil.offsetDay(DateUtil.parse(dayStr), offset), "yyyy-MM-dd HH:mm:ss");
}
}
/**
* 获取所有日期时间列表
*
* @param type 类型:
* 10.近12小时,20.近24小时每小时,30.近半天,40.近一天,50.近两天,60.近一周(每天),70.近两周,72.近15天每天,80.近一个月(每天),90.近半年(每月),93.近一年(每月)
* 100.今天(每小时),200.昨天,300.本周,400.本月(每天),500.本年(每月),600.去年
* @param pattern 格式 如yyyy-MM-dd HH:mm:ss
* @return
*/
public static List<String> getDateTimeStrList(int type, String pattern) {
if (type == 20) {
//近24小时每小时egHH:00
ArrayList<String> rtList = new ArrayList<>();
DateTime beginDate = DateUtil.yesterday();
DateTime endDate = DateTime.now();
long offset = DateUtil.between(beginDate, endDate, DateUnit.HOUR);
for (int i = 1; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetHour(beginDate, i), pattern));
}
return rtList;
} else if (type == 60) {
//近一周(每天)
ArrayList<String> rtList = new ArrayList<>();
DateTime beginDate = DateUtil.lastWeek();
DateTime endDate = DateTime.now();
long offset = DateUtil.betweenDay(beginDate, endDate, true);
for (int i = 1; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), pattern));
}
return rtList;
} else if (type == 72) {
//近15天每天
ArrayList<String> rtList = new ArrayList<>();
DateTime dateTime = DateUtil.parseDate(DateUtil.today());
for (int i = 0; i < 15; i++) {
rtList.add(DateUtil.format(DateUtil.offsetDay(dateTime, i * (-1)), pattern));
}
Collections.reverse(rtList);
return rtList;
} else if (type == 80) {
//近一个月(每天)
ArrayList<String> rtList = new ArrayList<>();
DateTime beginDate = DateUtil.lastMonth();
DateTime endDate = DateTime.now();
long offset = DateUtil.betweenDay(beginDate, endDate, true);
for (int i = 0; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), pattern));
}
return rtList;
} else if (type == 90) {
//近半年(每月)
ArrayList<String> rtList = new ArrayList<>();
DateTime endDate = DateTime.now();
DateTime beginDate = DateUtil.offsetMonth(endDate, -6);
long offset = DateUtil.betweenMonth(beginDate, endDate, true);
for (int i = 1; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetMonth(beginDate, i), pattern));
}
return rtList;
} else if (type == 93) {
//近一年(每月)
ArrayList<String> rtList = new ArrayList<>();
DateTime endDate = DateTime.now();
DateTime beginDate = DateUtil.offsetMonth(endDate, -12);
long offset = DateUtil.betweenMonth(beginDate, endDate, true);
for (int i = 1; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetMonth(beginDate, i), pattern));
}
return rtList;
} else if (type == 100) {
//100.今天(每小时)
ArrayList<String> rtList = new ArrayList<>();
DateTime beginDate = DateUtil.beginOfDay(DateTime.now());
DateTime endDate = DateUtil.endOfDay(DateTime.now());
long offset = DateUtil.between(beginDate, endDate, DateUnit.HOUR);
for (int i = 0; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetHour(beginDate, i), pattern));
}
return rtList;
} else if (type == 400) {
//本月(每天)
ArrayList<String> rtList = new ArrayList<>();
Date now = new Date();
DateTime beginDate = DateUtil.beginOfMonth(now);
DateTime endDate = DateUtil.endOfMonth(now);
long offset = DateUtil.betweenDay(beginDate, endDate, true);
for (int i = 0; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), pattern));
}
return rtList;
} else if (type == 500) {
//本年(每月)
ArrayList<String> rtList = new ArrayList<>();
DateTime beginDate = DateUtil.beginOfYear(DateTime.now());
DateTime endDate = DateUtil.endOfYear(DateTime.now());
long offset = DateUtil.betweenMonth(beginDate, endDate, true);
for (int i = 0; i < offset + 1; i++) {
rtList.add(DateUtil.format(DateUtil.offsetMonth(beginDate, i), pattern));
}
return rtList;
}
return new ArrayList<>();
}
/**
* str转换成datetime格式
*
* @param str
* @return
*/
public static DateTime parse(String str) {
if (Objects.equals(str.length(), 7)) {
return DateUtil.parse(str, "yyyy-MM");
}
return DateUtil.parse(str);
}
/**
* 是否正确的日期格式1:yyyy-MM-dd
*
* @param timeStr
* @param type
* @return
*/
public static boolean isValidDateFormat(String timeStr, int type) {
if (type == 1) {
String datePattern = "\\d{4}-\\d{2}-\\d{2}";
// 编译正则表达式模式
Pattern pattern = Pattern.compile(datePattern);
// 创建 Matcher 对象
Matcher matcher = pattern.matcher(timeStr);
// 检查是否匹配
if (matcher.matches()) {
return true;
} else {
return false;
}
}
return false;
}
/**
* 获取ISO8601时间秒级如2024-04-10T09:57:41+08:00
*
* @return
*/
public static String getISO8601Str(Date date) {
String pattern = "YYYY-MM-dd'T'HH:mm:ssZZ";
return DateFormatUtils.format(date, pattern);
}
/**
* 获取ISO8601时间秒级如2017-06-14T00:00:00.000+08:00
*
* @return
*/
public static String getISO8601StrWithMs(Date date) {
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
return DateFormatUtils.format(date, pattern);
}
/**
* 判断时间格式 格式必须为“yyyy-MM-dd HH:mm:ss”
*
* @param sDate
* @return
*/
public static void checkLegalDate19(String sDate) {
int legalLen = 19;
if ((sDate == null) || (sDate.length() != legalLen)) {
throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss");
}
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = formatter.parse(sDate);
boolean equals = sDate.equals(formatter.format(date));
if (!equals) {
throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss");
}
} catch (Exception e) {
throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss");
}
}
public static Date convertQueryDate(String dateStr, boolean isBegin) {
Date date = DateUtil.parse(dateStr);
if (dateStr.length() == 10) {
if (isBegin) {
date = DateUtil.beginOfDay(date);
} else {
date = DateUtil.endOfDay(date);
}
}
return date;
}
/**
* 合并去重时间段
*
* @return
*/
public static List<Map<String, Date>> getTimePeriodListDumplictcatePeriod(List<Map<String, Date>> periodList) {
List<Map<String, Date>> result = new ArrayList<>();
//列表不能为空
if (periodList == null) {
return null;
}
//对数据排序,开始时间从小到大
Collections.sort(periodList, new Comparator<Map<String, Date>>() {
@Override
public int compare(Map<String, Date> u1, Map<String, Date> u2) {
long diff = u1.get("startDate").getTime() - u2.get("startDate").getTime();
if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}
return 0; //相等为0
}
});
for (int i = 0; i < periodList.size() - 1; i++) {
int j = i + 1;
//判断 i的Endtime 与j 的Begintime 是否有交叉,有交叉,更新 j的Begintime 为i的Begintime, 并移除i
if (periodList.get(i).get("endDate").after(periodList.get(j).get("startDate"))) {
periodList.get(j).put("startDate", periodList.get(i).get("startDate"));
periodList.remove(i);
i--;
}
}
result = periodList;
return result;
}
/**
* 获取下一个周几,不包含自己
*
* @param d
* @param i 1对应周一7对应周日
* @return
*/
public static Date getNextDayOfWeek(Date d, int i) {
LocalDate localDate = LocalDate.parse(DateUtil.formatDate(d)).with(DayOfWeek.of(i));
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
Date from = Date.from(zonedDateTime.toInstant());
if (DateUtil.compare(DateUtil.parseDate(DateUtil.formatDate(d)), from) >= 0) {
from = DateUtil.offsetDay(from, 7);
} else {
from = DateUtil.offsetDay(from, 0);
}
return from;
}
/**
* 获取上一个周几,包含自己
*
* @param d
* @param i 1对应周一7对应周日
* @return
*/
public static Date getBeforeDayOfWeek(Date d, int i) {
LocalDate localDate = LocalDate.parse(DateUtil.formatDate(d)).with(DayOfWeek.of(i));
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
Date from = Date.from(zonedDateTime.toInstant());
if (DateUtil.compare(DateUtil.parseDate(DateUtil.formatDate(d)), from) < 0) {
from = DateUtil.offsetDay(from, -7);
} else {
from = DateUtil.offsetDay(from, 0);
}
return from;
}
}