当前位置: 首页 > news >正文

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

前言:最近在做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;
    }
}

相关文章:

  • 金仓数据库KingbaseES客户端应用参考手册--12. sys_dumpall
  • 最详细说明spring cloud和Spring Cloud Alibaba的联系和区别
  • 【0基础学算法】二分查找 (超详细讲解+私人笔记+源码)
  • 计算机网络作业(存储单位k、KB、MB、GB、TB、PB;手机运行内存和内存的区别)
  • 正则表达式 (Regex) 2022教程
  • 第五章Redis 的发布和订阅
  • Dueling Network Architectures for Deep Reinforcement Learning(Dueling-DQN)
  • Vue 3.2 + TypeScript + Pinia + Vite2 + Element-Plus 管理系统(开源啦 )
  • vue工程化vue-cli创建项目以及图形创建vue项目
  • 浏览器http提交protobuf二进制数据正常,微信小程序失败解决方案
  • 实现 QQuickImageProvider 的若干问题的思路
  • 算法——查找
  • C/C++语言100题练习计划 82——加勒比海盗船(贪心算法实现)
  • RHCE(四)--- DNS服务的正反向解析配置
  • VUE的侦听器watch
  • DOM的那些事
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • laravel5.5 视图共享数据
  • Mybatis初体验
  • Python socket服务器端、客户端传送信息
  • Sass Day-01
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 读懂package.json -- 依赖管理
  • 简析gRPC client 连接管理
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 使用common-codec进行md5加密
  • 我与Jetbrains的这些年
  • - 转 Ext2.0 form使用实例
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • %@ page import=%的用法
  • (poj1.3.2)1791(构造法模拟)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (简单) HDU 2612 Find a way,BFS。
  • (十八)三元表达式和列表解析
  • (四)鸿鹄云架构一服务注册中心
  • .axf 转化 .bin文件 的方法
  • .Net Web窗口页属性
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [asp.net core]project.json(2)
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [Java][算法 双指针]Day 02---LeetCode 热题 100---04~07
  • [javaSE] 数据结构(二叉查找树-插入节点)
  • [leetcode]_Symmetric Tree
  • [LeetCode]Spiral Matrix
  • [mysql] mysqldump 导出数据库表
  • [NKCTF 2024]web解析
  • [Python] scikit-learn中数据集模块介绍和使用案例
  • [Python] 集合操作及方法总结
  • [python]bar_chart_race设置日期格式
  • [QT]加快qt编译:设置默认多核编译qt