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


    前言:最近在做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格式并未做任何验证

    1. package com.wugui.datax.etl.utils;
    2. import java.text.SimpleDateFormat;
    3. import java.util.*;
    4. import java.util.regex.Matcher;
    5. import java.util.regex.Pattern;
    6. /**
    7. * 【JSimpleDateFormat用于分区修改的特殊操作】
    8. *
    9. * @author
    10. * @since 20220831 20:49:07
    11. */
    12. public class JSimpleDateFormat {
    13. private static final String BRACES = "[{}]";
    14. private static final String YEAR = "yyyy";
    15. private static final String MONTH = "MM";
    16. private static final String DAY = "dd";
    17. private static final String HOUR = "HH";
    18. private static final String MINUTE = "mm";
    19. private static final String SECOND = "ss";
    20. private static final String YEAR_PATTERN = "(?\\{yyyy:\\d+}|\\{yyyy-\\d+}|\\{yyyy+\\d+})";
    21. private static final String MONTH_PATTERN = "(?\\{MM:\\d+}|\\{MM-\\d+}|\\{MM+\\d+})";
    22. private static final String DAY_PATTERN = "(?\\{dd:\\d+}|\\{dd-\\d+}|\\{dd+\\d+})";
    23. private static final String HOUR_PATTERN = "(?\\{HH:\\d+}|\\{HH-\\d+}|\\{HH+\\d+})";
    24. private static final String MINUTE_PATTERN = "(?\\{mm:\\d+}|\\{mm-\\d+}|\\{mm+\\d+})";
    25. private static final String SECOND_PATTERN = "(?\\{ss:\\d+}|\\{ss-\\d+}|\\{ss+\\d+})";
    26. private String pattern = null;
    27. private Calendar calendar = null;
    28. /**
    29. * 使用方式 String format = new JSimpleDateFormat("yyyy{MM:03}{dd-12}0830").format();
    30. *
    31. * @author
    32. * @since 2022/09/01 15:21
    33. * @param format
    34. * @return null
    35. */
    36. public JSimpleDateFormat(String format) {
    37. // 获取当前时间
    38. Date currDateTime = new Date();
    39. // 构建日期对象
    40. Calendar calendar = Calendar.getInstance();
    41. // 初始化日期对象时间
    42. calendar.setTime(currDateTime);
    43. Map kvPair = new HashMap<>();
    44. kvPair.put("year", YEAR_PATTERN);
    45. kvPair.put("month", MONTH_PATTERN);
    46. kvPair.put("day", DAY_PATTERN);
    47. kvPair.put("hour", HOUR_PATTERN);
    48. kvPair.put("minute", MINUTE_PATTERN);
    49. kvPair.put("second", SECOND_PATTERN);
    50. List strings = Arrays.asList("year", "month", "day", "hour", "minute", "second");
    51. String pattern = format;
    52. for (String moss : strings) {
    53. pattern = buildFormat(calendar, pattern, kvPair.get(moss), moss);
    54. }
    55. this.pattern = pattern;
    56. this.calendar = calendar;
    57. }
    58. /**
    59. * 伪格式化
    60. *
    61. * @author
    62. * @since 2022/09/01 15:24
    63. * @return java.lang.String
    64. */
    65. public String format(){
    66. return new SimpleDateFormat(pattern).format(this.calendar.getTime());
    67. }
    68. /**
    69. * 构造最终的format格式串
    70. *
    71. * @param calendar Calendar
    72. * @param format String
    73. * @param pattern String
    74. * @return java.lang.String
    75. * @author
    76. * @since 2022/09/01 14:40
    77. */
    78. protected String buildFormat(Calendar calendar, String format, String pattern, String moss) {
    79. Pattern compile = Pattern.compile(pattern);
    80. Matcher matcher = compile.matcher(format);
    81. String resPattern = format;
    82. if (matcher.find()) {
    83. String ms = matcher.group(moss);
    84. switch (moss) {
    85. case "year":
    86. resPattern = overwriteYear(calendar, format, ms);
    87. break;
    88. case "month":
    89. resPattern = overwriteMonth(calendar, format, ms);
    90. break;
    91. case "day":
    92. resPattern = overwriteDay(calendar, format, ms);
    93. break;
    94. case "hour":
    95. resPattern = overwriteHour(calendar, format, ms);
    96. break;
    97. case "minute":
    98. resPattern = overwriteMinute(calendar, format, ms);
    99. break;
    100. case "second":
    101. resPattern = overwriteSecond(calendar, format, ms);
    102. break;
    103. }
    104. }
    105. return resPattern;
    106. }
    107. /**
    108. * 去除字符串中的{}特殊字符
    109. *
    110. * @param src 原始字符串{yyyy-1}
    111. * @return java.lang.String
    112. * @author
    113. * @since 2022/09/01 13:13
    114. */
    115. protected String removeBraces(String src) {
    116. return src.replaceAll(BRACES, "");
    117. }
    118. /**
    119. * 重写年份 calendar 对象已及回传年份的format格式
    120. *
    121. * @param calendar Calendar
    122. * @param format String
    123. * @param year String
    124. * @return java.lang.String
    125. * @author
    126. * @since 2022/09/01 13:14
    127. */
    128. protected String overwriteYear(Calendar calendar, String format, String year) {
    129. String resYear = format;
    130. String formatYear = removeBraces(year);
    131. if (formatYear.contains("-")) {
    132. String reduce = formatYear.split("-")[1];
    133. calendar.add(Calendar.YEAR, -Integer.parseInt(reduce));
    134. resYear = format.replace(year, YEAR);
    135. } else if (formatYear.contains("+")) {
    136. String add = formatYear.split("-")[1];
    137. calendar.add(Calendar.YEAR, Integer.parseInt(add));
    138. resYear = format.replace(year, YEAR);
    139. } else if (formatYear.contains(":")) {
    140. String yyyy = formatYear.split(":")[1];
    141. resYear = format.replace(year, yyyy);
    142. }
    143. return resYear;
    144. }
    145. /**
    146. * 重写月份 calendar 对象已及回传月份的format格式
    147. *
    148. * @param calendar Calendar
    149. * @param format String
    150. * @param month String
    151. * @return java.lang.String
    152. * @author
    153. * @since 2022/09/01 13:15
    154. */
    155. protected String overwriteMonth(Calendar calendar, String format, String month) {
    156. String resMonth = format;
    157. String formatMonth = removeBraces(month);
    158. if (formatMonth.contains("-")) {
    159. String reduce = formatMonth.split("-")[1];
    160. calendar.add(Calendar.MONTH, -Integer.parseInt(reduce));
    161. resMonth = format.replace(month, MONTH);
    162. } else if (formatMonth.contains("+")) {
    163. String add = formatMonth.split("-")[1];
    164. calendar.add(Calendar.MONTH, Integer.parseInt(add));
    165. resMonth = format.replace(month, MONTH);
    166. } else if (formatMonth.contains(":")) {
    167. String MM = formatMonth.split(":")[1];
    168. resMonth = format.replace(month, MM);
    169. }
    170. return resMonth;
    171. }
    172. /**
    173. * 重写DAY calendar 对象已及回传DAY的format格式
    174. *
    175. * @param calendar Calendar
    176. * @param format String
    177. * @param day String
    178. * @return java.lang.String
    179. * @author
    180. * @since 2022/09/01 13:15
    181. */
    182. protected String overwriteDay(Calendar calendar, String format, String day) {
    183. String resDay = format;
    184. String formatDay = removeBraces(day);
    185. if (formatDay.contains("-")) {
    186. String reduce = formatDay.split("-")[1];
    187. calendar.add(Calendar.DAY_OF_MONTH, -Integer.parseInt(reduce));
    188. resDay = format.replace(day, DAY);
    189. } else if (formatDay.contains("+")) {
    190. String add = formatDay.split("-")[1];
    191. calendar.add(Calendar.DAY_OF_MONTH, Integer.parseInt(add));
    192. resDay = format.replace(day, DAY);
    193. } else if (formatDay.contains(":")) {
    194. String MM = formatDay.split(":")[1];
    195. resDay = format.replace(day, MM);
    196. }
    197. return resDay;
    198. }
    199. /**
    200. * 重写HOUR calendar 对象已及回传HOUR的format格式
    201. *
    202. * @param calendar Calendar
    203. * @param format String
    204. * @param hour String
    205. * @return java.lang.String
    206. * @author
    207. * @since 2022/09/01 13:15
    208. */
    209. protected String overwriteHour(Calendar calendar, String format, String hour) {
    210. String resHour = format;
    211. String formatHour = removeBraces(hour);
    212. if (formatHour.contains("-")) {
    213. String reduce = formatHour.split("-")[1];
    214. calendar.add(Calendar.HOUR_OF_DAY, -Integer.parseInt(reduce));
    215. resHour = format.replace(hour, HOUR);
    216. } else if (formatHour.contains("+")) {
    217. String add = formatHour.split("-")[1];
    218. calendar.add(Calendar.HOUR_OF_DAY, Integer.parseInt(add));
    219. resHour = format.replace(hour, HOUR);
    220. } else if (formatHour.contains(":")) {
    221. String HH = formatHour.split(":")[1];
    222. resHour = format.replace(hour, HH);
    223. }
    224. return resHour;
    225. }
    226. /**
    227. * 重写MINUTE calendar 对象已及回传MINUTE的format格式
    228. *
    229. * @param calendar Calendar
    230. * @param format String
    231. * @param minute String
    232. * @return java.lang.String
    233. * @author
    234. * @since 2022/09/01 13:15
    235. */
    236. protected String overwriteMinute(Calendar calendar, String format, String minute) {
    237. String resMinute = format;
    238. String formatMinute = removeBraces(minute);
    239. if (formatMinute.contains("-")) {
    240. String reduce = formatMinute.split("-")[1];
    241. calendar.add(Calendar.MINUTE, -Integer.parseInt(reduce));
    242. resMinute = format.replace(minute, MINUTE);
    243. } else if (formatMinute.contains("+")) {
    244. String add = formatMinute.split("-")[1];
    245. calendar.add(Calendar.MINUTE, Integer.parseInt(add));
    246. resMinute = format.replace(minute, MINUTE);
    247. } else if (formatMinute.contains(":")) {
    248. String mm = formatMinute.split(":")[1];
    249. resMinute = format.replace(minute, mm);
    250. }
    251. return resMinute;
    252. }
    253. /**
    254. * 重写SECOND calendar 对象已及回传SECOND的format格式
    255. *
    256. * @param calendar Calendar
    257. * @param format String
    258. * @param second String
    259. * @return java.lang.String
    260. * @author
    261. * @since 2022/09/01 13:15
    262. */
    263. protected String overwriteSecond(Calendar calendar, String format, String second) {
    264. String resSecond = format;
    265. String formatSecond = removeBraces(second);
    266. if (formatSecond.contains("-")) {
    267. String reduce = formatSecond.split("-")[1];
    268. calendar.add(Calendar.SECOND, -Integer.parseInt(reduce));
    269. resSecond = format.replace(second, SECOND);
    270. } else if (formatSecond.contains("+")) {
    271. String add = formatSecond.split("-")[1];
    272. calendar.add(Calendar.SECOND, Integer.parseInt(add));
    273. resSecond = format.replace(second, SECOND);
    274. } else if (formatSecond.contains(":")) {
    275. String ss = formatSecond.split(":")[1];
    276. resSecond = format.replace(second, ss);
    277. }
    278. return resSecond;
    279. }
    280. }

  • 相关阅读:
    基于Algolia实现网站全文搜索
    ECC有关DER文件的解析(Java)
    Mysql的主从复制和读写分离
    el-switch组件在分页情况下的使用
    educoder_python:6-1-对象第1关:TOM猫原型 类
    BSV区块链协会上线首个版本的ARC交易处理器
    力扣刷题-数组-二分查找总结
    swift加载h5页面空白
    IDEA中maven模块灰色的原因与解决方案
    MYSQL SEQUENCE方案
  • 原文地址:https://blog.csdn.net/qq_41562136/article/details/126649968