常见的CRON、日期时间格式、日期工具、距今恰好3个月及Oracle:ORA-01810:格式代码出现两次、stream收集字段String类型转Long类型、日期加3个月

定时任务

常用cron表达式例子

(1)0/2 * * * * ? 表示每2秒 执行任务

(1)0 0/2 * * * ? 表示每2分钟 执行任务

(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务

(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业

(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作

(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

(6)0 0 12 ? * WED 表示每个星期三中午12点

(7)0 0 12 * * ? 每天中午12点触发

(8)0 15 10 ? * * 每天上午10:15触发

(9)0 15 10 * * ? 每天上午10:15触发

(10)0 15 10 * * ? 每天上午10:15触发

(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发

(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发

(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发

(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发

(18)0 15 10 15 * ? 每月15日上午10:15触发

(19)0 15 10 L * ? 每月最后一日的上午10:15触发

(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发

(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发

(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

postman 请求获取定时任务最近十次执行时间

9ccd5b7782b30f0a1ae2774052821d3a.png

代码请求获取定时任务最近十次执行时间

OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("CronExpression","0 0 0 * * ?")
  .build();
Request request = new Request.Builder()
  .url("https://api.qqe2.com/cron")
  .method("POST", body)
  .build();
Response response = client.newCall(request).execute();

日期时间格式

public class DatePattern {
    public static final Pattern REGEX_NORM = Pattern.compile("\\d{4}-\\d{1,2}-\\d{1,2}(\\s\\d{1,2}:\\d{1,2}(:\\d{1,2})?)?(.\\d{1,3})?");
    public static final String NORM_MONTH_PATTERN = "yyyy-MM";
    public static final FastDateFormat NORM_MONTH_FORMAT = FastDateFormat.getInstance("yyyy-MM");
    public static final DateTimeFormatter NORM_MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM");
    public static final String SIMPLE_MONTH_PATTERN = "yyyyMM";
    public static final FastDateFormat SIMPLE_MONTH_FORMAT = FastDateFormat.getInstance("yyyyMM");
    public static final DateTimeFormatter SIMPLE_MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM");
    public static final String NORM_DATE_PATTERN = "yyyy-MM-dd";
    public static final FastDateFormat NORM_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd");
    public static final DateTimeFormatter NORM_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    public static final String NORM_TIME_PATTERN = "HH:mm:ss";
    public static final FastDateFormat NORM_TIME_FORMAT = FastDateFormat.getInstance("HH:mm:ss");
    public static final DateTimeFormatter NORM_TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
    public static final String NORM_DATETIME_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
    public static final FastDateFormat NORM_DATETIME_MINUTE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm");
    public static final DateTimeFormatter NORM_DATETIME_MINUTE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
    public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public static final FastDateFormat NORM_DATETIME_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
    public static final DateTimeFormatter NORM_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public static final String NORM_DATETIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final FastDateFormat NORM_DATETIME_MS_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS");
    public static final DateTimeFormatter NORM_DATETIME_MS_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    public static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
    public static final FastDateFormat ISO8601_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss,SSS");
    public static final DateTimeFormatter ISO8601_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS");
    public static final String CHINESE_DATE_PATTERN = "yyyy年MM月dd日";
    public static final FastDateFormat CHINESE_DATE_FORMAT = FastDateFormat.getInstance("yyyy年MM月dd日");
    public static final DateTimeFormatter CHINESE_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS");
    public static final String CHINESE_DATE_TIME_PATTERN = "yyyy年MM月dd日HH时mm分ss秒";
    public static final FastDateFormat CHINESE_DATE_TIME_FORMAT = FastDateFormat.getInstance("yyyy年MM月dd日HH时mm分ss秒");
    public static final DateTimeFormatter CHINESE_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分ss秒");
    public static final String PURE_DATE_PATTERN = "yyyyMMdd";
    public static final FastDateFormat PURE_DATE_FORMAT = FastDateFormat.getInstance("yyyyMMdd");
    public static final DateTimeFormatter PURE_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
    public static final String PURE_TIME_PATTERN = "HHmmss";
    public static final FastDateFormat PURE_TIME_FORMAT = FastDateFormat.getInstance("HHmmss");
    public static final DateTimeFormatter PURE_TIME_FORMATTER = DateTimeFormatter.ofPattern("HHmmss");
    public static final String PURE_DATETIME_PATTERN = "yyyyMMddHHmmss";
    public static final FastDateFormat PURE_DATETIME_FORMAT = FastDateFormat.getInstance("yyyyMMddHHmmss");
    public static final DateTimeFormatter PURE_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    public static final String PURE_DATETIME_MS_PATTERN = "yyyyMMddHHmmssSSS";
    public static final FastDateFormat PURE_DATETIME_MS_FORMAT = FastDateFormat.getInstance("yyyyMMddHHmmssSSS");
    public static final DateTimeFormatter PURE_DATETIME_MS_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    public static final String HTTP_DATETIME_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z";
    public static final FastDateFormat HTTP_DATETIME_FORMAT;
    public static final String JDK_DATETIME_PATTERN = "EEE MMM dd HH:mm:ss zzz yyyy";
    public static final FastDateFormat JDK_DATETIME_FORMAT;
    public static final String UTC_SIMPLE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
    public static final FastDateFormat UTC_SIMPLE_FORMAT;
    public static final String UTC_SIMPLE_MS_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS";
    public static final FastDateFormat UTC_SIMPLE_MS_FORMAT;
    public static final String UTC_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    public static final FastDateFormat UTC_FORMAT;
    public static final String UTC_WITH_ZONE_OFFSET_PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ";
    public static final FastDateFormat UTC_WITH_ZONE_OFFSET_FORMAT;
    public static final String UTC_MS_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
    public static final FastDateFormat UTC_MS_FORMAT;
    public static final String UTC_MS_WITH_ZONE_OFFSET_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    public static final FastDateFormat UTC_MS_WITH_ZONE_OFFSET_FORMAT;

    public DatePattern() {
    }

    static {
        HTTP_DATETIME_FORMAT = FastDateFormat.getInstance("EEE, dd MMM yyyy HH:mm:ss z", TimeZone.getTimeZone("GMT"), Locale.US);
        JDK_DATETIME_FORMAT = FastDateFormat.getInstance("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
        UTC_SIMPLE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss", TimeZone.getTimeZone("UTC"));
        UTC_SIMPLE_MS_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS", TimeZone.getTimeZone("UTC"));
        UTC_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("UTC"));
        UTC_WITH_ZONE_OFFSET_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZ", TimeZone.getTimeZone("UTC"));
        UTC_MS_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", TimeZone.getTimeZone("UTC"));
        UTC_MS_WITH_ZONE_OFFSET_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSZ", TimeZone.getTimeZone("UTC"));
    }
}

将字符串格式化成日期,pattern

日期工具1

import cn.hutool.core.date.DateTime;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
public class DateUtil {
    /**
     * yyyy-MM-dd
     */
    public static String formatDate(Date date) {
        return formatDate(date, GlobalConstant.DateFormat.DATE_FORMAT);
    }

    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static String formatTime(Date date) {
        return formatDate(date, GlobalConstant.DateFormat.DATE_TIME_FORMAT);
    }

    /**
     * 格式化日期
     */
    public static String formatDate(Date date, String pattern) {
        if (date == null)
            return null;
        SimpleDateFormat sf = new SimpleDateFormat(pattern);
        return sf.format(date);
    }

    /**
     * 获取当前日期的字符串
     *
     * @param pattern --格式
     */
    public static String getCurrentDateStr(String pattern) {
        SimpleDateFormat sf = new SimpleDateFormat(pattern);
        Date dt = new Date(System.currentTimeMillis());
        return sf.format(dt);
    }

    /**
     * 字符串转为日期
     */
    public static Date strToDate(String dateStr, String pattern) throws ErrCodeException {
        SimpleDateFormat sf = new SimpleDateFormat(pattern);
        try {
            return sf.parse(dateStr);
        } catch (ParseException e) {
            log.error(e.getMessage(), e);
            throw new ErrCodeException(ErrorCodeEnum.PARAMS_CONVERT_ERROR, StringUtil
                    .format("字符串{}转为日期格式[{}]失败", dateStr, pattern));
        }
    }

    /**
     * yyyy-MM-dd
     */
    public static Date strToDate(String dateStr) throws ErrCodeException {
        return strToDate(dateStr, GlobalConstant.DateFormat.DATE_FORMAT);
    }

    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static Date strToTime(String dateStr) throws ErrCodeException {
        return strToDate(dateStr, GlobalConstant.DateFormat.DATE_TIME_FORMAT);
    }

    /**
     * 判断是否合法的日期
     */
    public static boolean isLegalDate(int year, int month, int day) {
        if (year < 1 || month < 1 || month > 12 || day < 1 || day > 31) {
            return false;
        }
        if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
            return false;
        }
        if (month == 2) {
            if ((year % 4 != 0) && day > 28) {
                return false;
            }
            if (year % 4 == 0) {
                if (year % 100 == 0 && year % 400 != 0) {
                    if (day > 28)
                        return false;
                } else if (day > 29) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 判断是否合法的日期
     */
    public static boolean isLegalDate(Date date) {
        String dateFormat = DateUtil.formatDate(date);
        String[] dateArr = dateFormat.split("-");
        int year = Integer.parseInt(dateArr[0]);
        int month = Integer.parseInt(dateArr[1]);
        int day = Integer.parseInt(dateArr[2]);
        return isLegalDate(year, month, day);
    }

    public static boolean isLeapYear(Date date) {
        int year = getYear(date);
        return (new GregorianCalendar()).isLeapYear(year);
    }

    public static int getYear(Date date) {
        String dateFormat = DateUtil.formatDate(date);
        String[] dateArr = dateFormat.split("-");
        return Integer.parseInt(dateArr[0]);
    }

    public static int getMonth(Date date) {
        String dateFormat = DateUtil.formatDate(date);
        String[] dateArr = dateFormat.split("-");
        return Integer.parseInt(dateArr[1]);
    }

    public static int getDay(Date date) {
        String dateFormat = DateUtil.formatDate(date);
        String[] dateArr = dateFormat.split("-");
        return Integer.parseInt(dateArr[2]);
    }

    /**
     * 獲取兩個日期間有多個2月29日
     *
     * @param start
     * @param end
     * @return
     */
    public static int leapTimes(Date start, Date end) {
        List<Integer> year = new ArrayList<>();
        int yearStart = getYear(start);
        int yearEnd = getYear(end);
        int yearGap = yearEnd - yearStart;
        year.add(yearStart);
        if (yearGap > 0) {
            for (int i = 1; i < yearGap; i++) {
                int temp = yearStart + i;
                year.add(temp);
            }
        }
        int leapDays = 0;
        if (cn.hutool.core.date.DateUtil.isLeapYear(yearStart) &&
                start.compareTo(getSpecialDate(yearStart)) < 1 &&
                end.compareTo(getSpecialDate(yearStart)) > -1) {

            leapDays = leapDays + 1;
            year = year.subList(1, year.size());
        }
        leapDays = leapDays + getLeapYears(year);
        if (isLeapYear(yearEnd) && end.compareTo(getSpecialDate(yearEnd)) < 1) {

            leapDays = leapDays - 1;
        }

        return leapDays;
    }


    /**
     * 計算年份間有多少個閏年
     * @param years
     * @return
     */
    private static int getLeapYears(List<Integer> years) {
        int[] ret = new int[]{0};
        years.forEach(y -> {
            if (cn.hutool.core.date.DateUtil.isLeapYear(y))
                ret[0] = ret[0] + 1;
        });
        return ret[0];
    }

    /**
     * 計算年份間有多少個閏年
     * @param start
     * @param end
     * @return
     */
    private static int getLeapYears(int start, int end) {
        if (start < end) {
            int temp = start;
            start = end;
            end = temp;
        }
        List<Integer> years = new ArrayList<>();
        int yearGap = end - start;
        years.add(start);
        if (yearGap > 0) {
            for (int i = 1; i < yearGap; i++) {
                int temp = start + i;
                years.add(temp);
            }
        }
        return getLeapYears(years);
    }

    private static Date getSpecialDate(int year) {
        String specialDate = (year) + "0228";
        return new DateTime(specialDate);
    }

    /**
     * 判斷年份是否是閏年
     * @param year
     * @return
     */
    private static boolean isLeapYear(int year) {
        return (new GregorianCalendar()).isLeapYear(year);
    }

    /**
     * 日期转换-  String -> Date
     *
     * @param dateString 字符串时间
     * @return Date类型信息
     * @throws Exception 抛出异常
     */
    public static Date parseString2Date(String dateString) throws Exception {
        if (dateString == null) {
            return null;
        }
        return parseString2Date(dateString, "yyyy-MM-dd");
    }

    /**
     * 日期转换-  String -> Date
     *
     * @param dateString 字符串时间
     * @param pattern    格式模板
     * @return Date类型信息
     * @throws Exception 抛出异常
     */
    public static Date parseString2Date(String dateString, String pattern) throws Exception {
        if (dateString == null) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Date date = sdf.parse(dateString);
        return date;
    }

    /**
     * 日期转换 Date -> String
     *
     * @param date Date类型信息
     * @return 字符串时间
     * @throws Exception 抛出异常
     */
    public static String parseDate2String(Date date) throws Exception {
        if (date == null) {
            return null;
        }
        return parseDate2String(date, "yyyy-MM-dd");
    }

    /**
     * 日期转换 Date -> String
     *
     * @param date    Date类型信息
     * @param pattern 格式模板
     * @return 字符串时间
     * @throws Exception 抛出异常
     */
    public static String parseDate2String(Date date, String pattern) throws Exception {
        if (date == null) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        String strDate = sdf.format(date);
        return strDate;
    }

    /**
     * 获取当前日期的本周一是几号
     *
     * @return 本周一的日期
     */
    public static Date getThisWeekMonday() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return cal.getTime();
    }

    /**
     * 获取当前日期周的最后一天
     *
     * @return 当前日期周的最后一天
     */
    public static Date getSundayOfThisWeek() {
        Calendar c = Calendar.getInstance();
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (dayOfWeek == 0) {
            dayOfWeek = 7;
        }
        c.add(Calendar.DATE, -dayOfWeek + 7);
        return c.getTime();
    }

    /**
     * 根据日期区间获取月份列表
     *
     * @param minDate 开始时间
     * @param maxDate 结束时间
     * @return 月份列表
     * @throws Exception
     */
    public static List<String> getMonthBetween(String minDate, String maxDate, String format) throws Exception {
        ArrayList<String> result = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");

        Calendar min = Calendar.getInstance();
        Calendar max = Calendar.getInstance();

        min.setTime(sdf.parse(minDate));
        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);

        max.setTime(sdf.parse(maxDate));
        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
        SimpleDateFormat sdf2 = new SimpleDateFormat(format);

        Calendar curr = min;
        while (curr.before(max)) {
            result.add(sdf2.format(curr.getTime()));
            curr.add(Calendar.MONTH, 1);
        }

        return result;
    }

    /**
     * 根据日期获取年度中的周索引
     *
     * @param date 日期
     * @return 周索引
     * @throws Exception
     */
    public static Integer getWeekOfYear(String date) throws Exception {
        Date useDate = parseString2Date(date);
        Calendar cal = Calendar.getInstance();
        cal.setTime(useDate);
        return cal.get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 根据年份获取年中周列表
     *
     * @param year 年分
     * @return 周列表
     * @throws Exception
     */
    public static Map<Integer, String> getWeeksOfYear(String year) throws Exception {
        Date useDate = parseString2Date(year, "yyyy");
        Calendar cal = Calendar.getInstance();
        cal.setTime(useDate);
        //获取年中周数量
        int weeksCount = cal.getWeeksInWeekYear();
        Map<Integer, String> mapWeeks = new HashMap<>(55);
        for (int i = 0; i < weeksCount; i++) {
            cal.get(Calendar.DAY_OF_YEAR);
            mapWeeks.put(i + 1, parseDate2String(getFirstDayOfWeek(cal.get(Calendar.YEAR), i)));
        }
        return mapWeeks;
    }

    /**
     * 获取某年的第几周的开始日期
     *
     * @param year 年分
     * @param week 周索引
     * @return 开始日期
     * @throws Exception
     */
    public static Date getFirstDayOfWeek(int year, int week) throws Exception {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, Calendar.JANUARY);
        c.set(Calendar.DATE, 1);

        Calendar cal = (GregorianCalendar) c.clone();
        cal.add(Calendar.DATE, week * 7);

        return getFirstDayOfWeek(cal.getTime());
    }

    /**
     * 获取某年的第几周的结束日期
     *
     * @param year 年份
     * @param week 周索引
     * @return 结束日期
     * @throws Exception
     */
    public static Date getLastDayOfWeek(int year, int week) throws Exception {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, Calendar.JANUARY);
        c.set(Calendar.DATE, 1);

        Calendar cal = (GregorianCalendar) c.clone();
        cal.add(Calendar.DATE, week * 7);

        return getLastDayOfWeek(cal.getTime());
    }

    /**
     * 获取当前时间所在周的开始日期
     *
     * @param date 当前时间
     * @return 开始时间
     */
    public static Date getFirstDayOfWeek(Date date) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(Calendar.SUNDAY);
        c.setTime(date);
        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
        return c.getTime();
    }

    /**
     * 获取当前时间所在周的结束日期
     *
     * @param date 当前时间
     * @return 结束日期
     */
    public static Date getLastDayOfWeek(Date date) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(Calendar.SUNDAY);
        c.setTime(date);
        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6);
        return c.getTime();
    }

    //获得上周一的日期
    public static Date geLastWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -7);
        return cal.getTime();
    }

    //获得本周一的日期
    public static Date getThisWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return cal.getTime();
    }

    //获得下周一的日期
    public static Date getNextWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, 7);
        return cal.getTime();
    }

    //获得今天日期
    public static Date getToday() {
        return new Date();
    }

    //获得本月一日的日期
    public static Date getFirstDay4ThisMonth() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 比較日期大小,
     * 1、同一日期,返回0; 2、 before日期早於after,返回 -1,否則返回1;
     *
     * @param before
     * @param after
     * @return
     */
    public static int compareTo(Date before, Date after) {
        return before.compareTo(after);
    }

    public static void main(String[] args) {
        try {
            System.out.println("本周一" + parseDate2String(getThisWeekMonday()));
            System.out.println("本月一日" + parseDate2String(getFirstDay4ThisMonth()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

日期工具2(比大小)、当日日期

import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Date;
import static cn.hutool.core.date.DatePattern.PURE_DATE_PATTERN;
@Component
@Slf4j
public class DateUtils {

    public Date today;

    /**
     * 校驗證件時間有效情況
     *
     * @param start
     * @param end
     * @param date
     * @return
     */
    public static boolean checkTpOrFeValid(Date start, Date end, Date date) {
        // 簽發日期與指定日期
        if (cn.hutool.core.date.DateUtil.compare(start, date) > -1) {
            return false;
        }
        if (cn.hutool.core.date.DateUtil.compare(date, end) > -1) {
            return false;
        }
        // 簽發日期與截止日期跨度是否超過兩年
        if (DateUtil.betweenDay(start, end, true) > (730 + DateUtil.leapTimes(start, end))) {
            return false;
        }
        return true;
    }

    // 校驗有效期,與當前日期相比
    public static boolean checkDuration2CurrentValid(Date end) {
        // 簽發日期與指定日期
        Date date = new Date();
        return DateUtil.compare(end, date) <= -1;
    }

    // 日期與指定日期相比
    public static boolean checkDuration2AppointDateValid(Date start, Date appointDate) {
        return DateUtil.compare(start, appointDate) <= -1;
    }

    // 校驗日期是否早於當前日期
    public static boolean isBeforeToday(Date date) {
        Date today = new Date();
        return DateUtil.compare(date, today) <= -1;
    }

    // 校驗日期是否晚於當前日期
    public static boolean isAfterToday(Date date) {
        Date today = new Date();
        return DateUtil.compare(today, date) <= -1;
    }

    @PostConstruct
    @Scheduled(cron = "0 0 0 * * ?")
    public void todayInit() {
        Date date = new Date();
        this.today = date;
        log.info("===> 定時任務結束,今日是{}", DateUtil.format(date,"yyyyMMdd"));
    }

    /**
     * 格式化日期,今日,僅支持年月日格式,today是定时任务维护的
     */
    public String formatDate4Today(String pattern) {       
         
        SimpleDateFormat sf = new SimpleDateFormat(pattern);
        return sf.format(this.today);
    }

    /**
     * 格式化日期
     */
    public String formatDate4Now(String pattern) {
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat(pattern);
        return sf.format(now);
    }
}

Oracle:ORA-01810:格式代码出现两次 日期格式、时间格式、to_date错误

原因:sql语句中,格式化出现了两次mm, 月份 mm 分钟 mm

月份 mm 分钟 mm

select *
from tb_user user0_
where to_date(user0_.permit_end, 'YYYY-MM-DD HH:mm:ss') > to_date('2022-08-17', 'YYYY-MM-DD HH:mm:ss')

改成如下即可select *
from tb_user user0_
where to_date(user0_.permit_end, 'YYYY-MM-DD HH:mi:ss') > to_date('2022-08-17', 'YYYY-MM-DD HH:mi:ss')

stream收集String类型转Long类型

List<String> list = Arrays.asList("5", "4", "3", "2", "7", "1", "6", "0", "8");

//方式一:转换

List<Long> newList1 = list.stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());

//方式二:处理返回LongStream;LongStream.boxed 将 LongStream 转换为 Stream<Long> ,然后您可以收集到列表中

List<Long> newList2 = list.stream().mapToLong(t -> Long.parseLong(t.trim())).boxed().collect(Collectors.toList());

JPA查询距今恰好3个月的数据

 private static Specification<User> getUserSpecification() {
        Calendar start = Calendar.getInstance();
        start.add(Calendar.MONTH, -3);
        start.set(Calendar.HOUR_OF_DAY, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        start.set(Calendar.MILLISECOND, 0);

        Calendar end = Calendar.getInstance();
        end.add(Calendar.MONTH, -3);
        end.set(Calendar.HOUR_OF_DAY, 23);
        end.set(Calendar.MINUTE, 59);
        end.set(Calendar.SECOND, 59);
        end.set(Calendar.MILLISECOND, 59);

        return (root, query, cb) -> {
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(cb.greaterThan(root.get("permitEnd").as(Date.class), start.getTime()));
            predicates.add(cb.lessThan(root.get("permitEnd").as(Date.class), end.getTime()));
            Predicate[] p = new Predicate[predicates.size()];
            return cb.and(predicates.toArray(p));
        };
    }

JPA-Specificatio取时间段范围类的数据

(DateUtil 来自hutool工具类,Constants.DATE_FORMAT 指定日期格式化形式即可)

Specification<Class> specification = (Specification<Class>) (root, query, cb) -> {
        List<Predicate> list = new ArrayList<>(); 
        // 所有的断言      
      if(StringUtils.isNotEmpty(req.getStartTime())&&StringUtils.isNotEmpty(req.getEndTime())){
            Date startTime=DateUtil.parse(req.getStartTime() + " 00:00:00", Constants.DATE_FORMAT);
            Date endTime=DateUtil.parse(req.getEndTime() + " 23:59:59", Constants.DATE_FORMAT);
            list.add(cb.between(root.get("submitDate"), startTime, endTime));
        }        
        Predicate[] p = new Predicate[list.size()];
        return cb.and(list.toArray(p));
    };

日历加3个月

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值