package com.msxf.dlp.worker.service.core.udf.function;
import com.msxf.dlp.worker.commons.annotation.UdfTemplateComment;
import com.msxf.dlp.worker.commons.exception.UDFException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
/**
* 时间工具自定义函数
*
* @author : jie.hu02@msxf.com
* @since : 2022/8/4 14:29
*/
public class DateUdf {
/**
* 当前时间
*
* @return 日期对象
*/
@UdfTemplateComment(value = "date()",
methodComment = "当前时间",
returnComment = "java.util.Date 当前时间")
public static Date date() {
return new Date();
}
/**
* 当前时间戳
*
* @return 时间戳
*/
@UdfTemplateComment(value = "timestamp()",
methodComment = "当前时间戳",
returnComment = "long 当前时间戳")
public static long timestamp() {
return System.currentTimeMillis();
}
/**
* 时间戳转日期对象
*
* @param timestamp 时间戳字符串
* @return 时间戳转日期对象
*/
@UdfTemplateComment(value = "timestampToDate(Object timestamp)",
methodComment = "时间戳转日期对象",
paramComment = "timestamp 时间戳字符串",
returnComment = "java.util.Date 时间戳转化后的时间对象")
public static Date timestampToDate(Object timestamp) {
if (Objects.isNull(timestamp)) {
return null;
}
return new Date(Long.parseLong(timestamp.toString()));
}
/**
* 时间戳转日期对象
*
* @param timestamp 时间戳字符串
* @param unit 单位,1-毫秒, 1000 -秒,60000-分
* @return 时间戳转日期对象
*/
@UdfTemplateComment(value = "timestampToDate(Object timestamp, long unit)",
methodComment = "时间戳转日期对象(按照单位)",
paramComment = {"timestamp 时间戳字符串", "unit 单位,1-毫秒, 1000 -秒,60000-分"},
returnComment = "java.util.Date 当前戳按照具体单位转化后的时间对象")
public static Date timestampToDate(Object timestamp, long unit) {
if (unit <= 0) {
throw new UDFException(String.format("时间戳转日期对象异常,单位:%s", unit));
}
return new Date(Long.parseLong(timestamp.toString()) * unit);
}
/**
* 日期对象转时间戳
*
* @param date 日期对象
* @return 时间戳
*/
@UdfTemplateComment(value = "dateToTimestamp(Date date)",
methodComment = "时间戳转日期对象(按照单位)",
paramComment = "date 日期对象",
returnComment = "long 时间对象转化后的时间戳")
public static long dateToTimestamp(Date date) {
return date.getTime();
}
/**
* 获取时间戳
*
* @param date 时间
* @param unit 单位,1-毫秒, 1000 -秒,60000-分
* @return 时间戳
*/
@UdfTemplateComment(value = "dateToTimestamp(Date date, long unit)",
methodComment = "获取时间戳(按照单位)",
paramComment = {"date 时间", "unit 单位,1-毫秒, 1000 -秒,60000-分"},
returnComment = "long 时间对象按照单位转化后的时间戳")
public static long dateToTimestamp(Date date, long unit) {
if (unit <= 0) {
throw new UDFException(String.format("获取时间戳异常,单位:%s", unit));
}
return date.getTime() / unit;
}
/**
* 取两个时间的最小值
*
* @param date1 时间对象1
* @param date2 时间对象2
* @return 最小时间
*/
@UdfTemplateComment(value = "min(Date date1, Date date2)",
methodComment = "取两个时间的最小值",
paramComment = {"date1 时间对象1", "date2 时间对象2"},
returnComment = "java.util.Date 两个时间对象的最小者")
public static Date min(Date date1, Date date2) {
return date1.before(date2) ? date1 : date2;
}
/**
* 取两个时间的最大值
*
* @param date1 时间对象1
* @param date2 时间对象2
* @return 最大时间
*/
@UdfTemplateComment(value = "max(Date date1, Date date2)",
methodComment = "取两个时间的最大值",
paramComment = {"date1 时间对象1", "date2 时间对象2"},
returnComment = "java.util.Date 两个时间对象的最大者")
public static Date max(Date date1, Date date2) {
return date1.after(date2) ? date1 : date2;
}
/**
* 按指定格式将字符串转换为日期
*
* @param dateStr 日期串
* @param pattern 格式
* @return 日期
*/
@UdfTemplateComment(value = "parse(String dateStr, String pattern)",
methodComment = "按指定格式将字符串转换为日期",
paramComment = {"dateStr 日期字符串", "pattern 格式"},
returnComment = "java.util.Date 时间字符串按照对应模式转化后的时间对象")
public static Date parse(String dateStr, String pattern) throws Exception {
return new SimpleDateFormat(pattern).parse(dateStr);
}
/**
* 将日期格式化为字符串
*
* @param date 日期
* @param pattern 格式
* @return 日期字符串
*/
@UdfTemplateComment(value = "format(Date date, String pattern)",
methodComment = "将日期格式化为字符串",
paramComment = {"date 日期", "pattern 格式"},
returnComment = "java.lang.String 时间对象按照指定模式转化后的时间字符串")
public static String format(Date date, String pattern) {
if (Objects.isNull(date)) {
return null;
}
return new SimpleDateFormat(pattern).format(date);
}
/**
* 偏移时间中指定字段的值
*
* @param date 时间
* @param field 字段 YEAR = 1; MONTH = 2; DATE = 5;HOUR = 10;MINUTE = 12;SECOND = 13;MILLISECOND = 14;
* @param offset 偏移
* @return 字符串格式时间
*/
@UdfTemplateComment(value = "add(Date date, int field, int offset)",
methodComment = "偏移时间中指定字段的值",
paramComment = {"date 日期", "field 字段 YEAR = 1; MONTH = 2; DATE = 5;HOUR = 10;MINUTE = 12;SECOND = 13;MILLISECOND = 14;", "offset 偏移"},
returnComment = "java.util.Date 时间对象按照ADD指定规则后时间对象")
public static Date add(Date date, int field, int offset) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(field, offset);
return cal.getTime();
}
}
这个udf函数
用在这个·sql中什么意思
delete from cdp_data.app_csc_icrm_real_time_xma_lia_online_2 where create_dt < "$dateUdf.format($dateUdf.date(), 'yyyy-MM-dd HH:mm:ss')"
最新发布