前言:最近在做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 = "(?
\\{yyyy:\\d+}|\\{yyyy-\\d+}|\\{yyyy+\\d+})" ; - private static final String MONTH_PATTERN = "(?
\\{MM:\\d+}|\\{MM-\\d+}|\\{MM+\\d+})" ; - private static final String DAY_PATTERN = "(?
\\{dd:\\d+}|\\{dd-\\d+}|\\{dd+\\d+})" ; - private static final String HOUR_PATTERN = "(?
\\{HH:\\d+}|\\{HH-\\d+}|\\{HH+\\d+})" ; - private static final String MINUTE_PATTERN = "(?
\\{mm:\\d+}|\\{mm-\\d+}|\\{mm+\\d+})" ; - private static final String SECOND_PATTERN = "(?
\\{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
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
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;
- }
- }