根据当前日期获取前一天日期-小工具

没有检索到摘要

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:最近在做Hive数据中台的项目,关于Hive分区部分需要在前端定义,且需要满足日期自定义,日期随定时任务自动填充。

功能描述:用户在数据中台定义定时任务,任务需要按照指定时间启动,并且获取指定分区的数据,比如T-1的数据,定时任务在2022-09-01 12:00:00 启动任务,获取的分区必须是前一天11:30生成的分区数据,同时今天的定时任务生成的数据存入2022-09-01 11:30分区中,并且分区格式为yyyyMMddHHmm , 该需求需要通过Java自动生成。

思路:Java有一个SimpleDateFormat可以做时间格式化输出, 比如new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date())。

我希望用户可以使用这种格式简单的完成数据格式的定义自己的数据同时满足需求,因此有如下格式定义: 

format格式含义备注
yyyyMM{dd-2}HHmm当前时间向前减两天其他不变
yyyyMMdd1130 当前日期拼接到11:30   如:202209011130无论什么时间执行得到的结果都是如此
yyyyMM{dd:22}HHmm当前时间日期为22其他时间不变同上

注意:因为只是使用简单功能format格式并未做任何验证

package com.wugui.datax.etl.utils;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 【JSimpleDateFormat用于分区修改的特殊操作】
 *
 * @author 
 * @since 20220831 20:49:07
 */
public class JSimpleDateFormat {
    private static final String BRACES = "[{}]";
    private static final String YEAR = "yyyy";
    private static final String MONTH = "MM";
    private static final String DAY = "dd";
    private static final String HOUR = "HH";
    private static final String MINUTE = "mm";
    private static final String SECOND = "ss";

    private static final String YEAR_PATTERN = "(?<year>\\{yyyy:\\d+}|\\{yyyy-\\d+}|\\{yyyy+\\d+})";
    private static final String MONTH_PATTERN = "(?<month>\\{MM:\\d+}|\\{MM-\\d+}|\\{MM+\\d+})";
    private static final String DAY_PATTERN = "(?<day>\\{dd:\\d+}|\\{dd-\\d+}|\\{dd+\\d+})";
    private static final String HOUR_PATTERN = "(?<hour>\\{HH:\\d+}|\\{HH-\\d+}|\\{HH+\\d+})";
    private static final String MINUTE_PATTERN = "(?<minute>\\{mm:\\d+}|\\{mm-\\d+}|\\{mm+\\d+})";
    private static final String SECOND_PATTERN = "(?<second>\\{ss:\\d+}|\\{ss-\\d+}|\\{ss+\\d+})";

    private String pattern = null;
    private Calendar calendar = null;

    /**
     * 使用方式 String format = new JSimpleDateFormat("yyyy{MM:03}{dd-12}0830").format();
     * 
     * @author 
     * @since 2022/09/01 15:21
     * @param format
     * @return null
     */
    public JSimpleDateFormat(String format) {
        // 获取当前时间
        Date currDateTime = new Date();

        // 构建日期对象
        Calendar calendar = Calendar.getInstance();

        // 初始化日期对象时间
        calendar.setTime(currDateTime);

        Map<String, String> kvPair = new HashMap<>();
        kvPair.put("year", YEAR_PATTERN);
        kvPair.put("month", MONTH_PATTERN);
        kvPair.put("day", DAY_PATTERN);
        kvPair.put("hour", HOUR_PATTERN);
        kvPair.put("minute", MINUTE_PATTERN);
        kvPair.put("second", SECOND_PATTERN);

        List<String> strings = Arrays.asList("year", "month", "day", "hour", "minute", "second");

        String pattern = format;
        for (String moss : strings) {
            pattern = buildFormat(calendar, pattern, kvPair.get(moss), moss);
        }
        this.pattern = pattern;
        this.calendar = calendar;
    }

    /**
     * 伪格式化
     *
     * @author 
     * @since 2022/09/01 15:24
     * @return java.lang.String
     */
    public String format(){
        return new SimpleDateFormat(pattern).format(this.calendar.getTime());
    }

    /**
     * 构造最终的format格式串
     *
     * @param calendar Calendar
     * @param format   String
     * @param pattern  String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 14:40
     */
    protected String buildFormat(Calendar calendar, String format, String pattern, String moss) {
        Pattern compile = Pattern.compile(pattern);
        Matcher matcher = compile.matcher(format);

        String resPattern = format;
        if (matcher.find()) {
            String ms = matcher.group(moss);
            switch (moss) {
                case "year":
                    resPattern = overwriteYear(calendar, format, ms);
                    break;
                case "month":
                    resPattern = overwriteMonth(calendar, format, ms);
                    break;
                case "day":
                    resPattern = overwriteDay(calendar, format, ms);
                    break;
                case "hour":
                    resPattern = overwriteHour(calendar, format, ms);
                    break;
                case "minute":
                    resPattern = overwriteMinute(calendar, format, ms);
                    break;
                case "second":
                    resPattern = overwriteSecond(calendar, format, ms);
                    break;
            }
        }

        return resPattern;
    }

    /**
     * 去除字符串中的{}特殊字符
     *
     * @param src 原始字符串{yyyy-1}
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:13
     */
    protected String removeBraces(String src) {
        return src.replaceAll(BRACES, "");
    }

    /**
     * 重写年份 calendar 对象已及回传年份的format格式
     *
     * @param calendar Calendar
     * @param format   String
     * @param year     String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:14
     */
    protected String overwriteYear(Calendar calendar, String format, String year) {
        String resYear = format;
        String formatYear = removeBraces(year);
        if (formatYear.contains("-")) {
            String reduce = formatYear.split("-")[1];
            calendar.add(Calendar.YEAR, -Integer.parseInt(reduce));
            resYear = format.replace(year, YEAR);
        } else if (formatYear.contains("+")) {
            String add = formatYear.split("-")[1];
            calendar.add(Calendar.YEAR, Integer.parseInt(add));
            resYear = format.replace(year, YEAR);
        } else if (formatYear.contains(":")) {
            String yyyy = formatYear.split(":")[1];
            resYear = format.replace(year, yyyy);
        }
        return resYear;
    }

    /**
     * 重写月份 calendar 对象已及回传月份的format格式
     *
     * @param calendar Calendar
     * @param format   String
     * @param month    String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:15
     */
    protected String overwriteMonth(Calendar calendar, String format, String month) {
        String resMonth = format;
        String formatMonth = removeBraces(month);
        if (formatMonth.contains("-")) {
            String reduce = formatMonth.split("-")[1];
            calendar.add(Calendar.MONTH, -Integer.parseInt(reduce));
            resMonth = format.replace(month, MONTH);
        } else if (formatMonth.contains("+")) {
            String add = formatMonth.split("-")[1];
            calendar.add(Calendar.MONTH, Integer.parseInt(add));
            resMonth = format.replace(month, MONTH);
        } else if (formatMonth.contains(":")) {
            String MM = formatMonth.split(":")[1];
            resMonth = format.replace(month, MM);
        }
        return resMonth;
    }

    /**
     * 重写DAY calendar 对象已及回传DAY的format格式
     *
     * @param calendar Calendar
     * @param format   String
     * @param day      String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:15
     */
    protected String overwriteDay(Calendar calendar, String format, String day) {
        String resDay = format;
        String formatDay = removeBraces(day);
        if (formatDay.contains("-")) {
            String reduce = formatDay.split("-")[1];
            calendar.add(Calendar.DAY_OF_MONTH, -Integer.parseInt(reduce));
            resDay = format.replace(day, DAY);
        } else if (formatDay.contains("+")) {
            String add = formatDay.split("-")[1];
            calendar.add(Calendar.DAY_OF_MONTH, Integer.parseInt(add));
            resDay = format.replace(day, DAY);
        } else if (formatDay.contains(":")) {
            String MM = formatDay.split(":")[1];
            resDay = format.replace(day, MM);
        }
        return resDay;
    }

    /**
     * 重写HOUR calendar 对象已及回传HOUR的format格式
     *
     * @param calendar Calendar
     * @param format   String
     * @param hour     String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:15
     */
    protected String overwriteHour(Calendar calendar, String format, String hour) {
        String resHour = format;
        String formatHour = removeBraces(hour);
        if (formatHour.contains("-")) {
            String reduce = formatHour.split("-")[1];
            calendar.add(Calendar.HOUR_OF_DAY, -Integer.parseInt(reduce));
            resHour = format.replace(hour, HOUR);
        } else if (formatHour.contains("+")) {
            String add = formatHour.split("-")[1];
            calendar.add(Calendar.HOUR_OF_DAY, Integer.parseInt(add));
            resHour = format.replace(hour, HOUR);
        } else if (formatHour.contains(":")) {
            String HH = formatHour.split(":")[1];
            resHour = format.replace(hour, HH);
        }
        return resHour;
    }

    /**
     * 重写MINUTE calendar 对象已及回传MINUTE的format格式
     *
     * @param calendar Calendar
     * @param format   String
     * @param minute   String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:15
     */
    protected String overwriteMinute(Calendar calendar, String format, String minute) {
        String resMinute = format;
        String formatMinute = removeBraces(minute);
        if (formatMinute.contains("-")) {
            String reduce = formatMinute.split("-")[1];
            calendar.add(Calendar.MINUTE, -Integer.parseInt(reduce));
            resMinute = format.replace(minute, MINUTE);
        } else if (formatMinute.contains("+")) {
            String add = formatMinute.split("-")[1];
            calendar.add(Calendar.MINUTE, Integer.parseInt(add));
            resMinute = format.replace(minute, MINUTE);
        } else if (formatMinute.contains(":")) {
            String mm = formatMinute.split(":")[1];
            resMinute = format.replace(minute, mm);
        }
        return resMinute;
    }

    /**
     * 重写SECOND calendar 对象已及回传SECOND的format格式
     *
     * @param calendar Calendar
     * @param format   String
     * @param second   String
     * @return java.lang.String
     * @author 
     * @since 2022/09/01 13:15
     */
    protected String overwriteSecond(Calendar calendar, String format, String second) {
        String resSecond = format;
        String formatSecond = removeBraces(second);
        if (formatSecond.contains("-")) {
            String reduce = formatSecond.split("-")[1];
            calendar.add(Calendar.SECOND, -Integer.parseInt(reduce));
            resSecond = format.replace(second, SECOND);
        } else if (formatSecond.contains("+")) {
            String add = formatSecond.split("-")[1];
            calendar.add(Calendar.SECOND, Integer.parseInt(add));
            resSecond = format.replace(second, SECOND);
        } else if (formatSecond.contains(":")) {
            String ss = formatSecond.split(":")[1];
            resSecond = format.replace(second, ss);
        }
        return resSecond;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值