1.把字符串转化为时间戳,再将时间戳转化为Date对象 /** *@parame time = 2016-12-12 19:41:59 * 或者2016

本文介绍了如何在JavaScript中进行时间与日期的相互转换,包括将当前时间转换为时间戳、日期字符串,以及如何从日期字符串和时间戳中提取日期信息。

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

1、当前时间换时间戳

var timestamp = parseInt(new Date().getTime()/1000);    // 当前时间戳
document.write(timestamp);

 

2、当前时间换日期字符串

var now = new Date();
var yy = now.getFullYear();      //
var mm = now.getMonth() + 1;     //
var dd = now.getDate();          //
var hh = now.getHours();         //
var ii = now.getMinutes();       //
var ss = now.getSeconds();       //
var clock = yy + "-";
if(mm < 10) clock += "0";
clock += mm + "-";
if(dd < 10) clock += "0";
clock += dd + " ";
if(hh < 10) clock += "0";
clock += hh + ":";
if (ii < 10) clock += ‘0‘; 
clock += ii + ":";
if (ss < 10) clock += ‘0‘; 
clock += ss;
document.write(clock);     //获取当前日期

 

3、日期字符串转时间戳

var date = ‘2015-03-05 17:59:00.0‘;
date = date.substring(0,19);    
date = date.replace(/-/g,‘/‘); 
var timestamp = new Date(date).getTime();
document.write(timestamp);

 

4、时间戳转日期字符串

var timestamp = ‘1425553097‘;
var d = new Date(timestamp * 1000);    //根据时间戳生成的时间对象
var date = (d.getFullYear()) + "-" +
           (d.getMonth() + 1) + "-" +
           (d.getDate()) + " " +
           (d.getHours()) + ":" +
           (d.getMinutes()) + ":" +
           (d.getSeconds());
document.write(date);
转自http://www.mamicode.com/info-detail-500319.html
非常感谢
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')"
最新发布
07-17
<think>我们有一个UDF类DateUdf,其中包含多个处理日期和时间的方法。 在给定的SQL语句中,使用了两个UDF函数: 1. `$dateUdf.date()`: 调用DateUdf类的date()方法,返回当前时间的Date对象。 2. `$dateUdf.format(...)`: 调用DateUdf类的format方法,将Date对象格式化为字符串。 具体在SQL中的部分: `"$dateUdf.format($dateUdf.date(), 'yyyy-MM-dd HH:mm:ss')"` 相当于: 第一步:获取当前时间(Date对象-> date()方法 第二步:将当前时间格式化为字符串,格式为"yyyy-MM-dd HH:mm:ss"(例如:"2024-06-04 10:30:45") 整个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')"` 意思是:删除表`cdp_data.app_csc_icrm_real_time_xma_lia_online_2`中,`create_dt`字段值小于当前时间(格式化为字符串后的值)的所有记录。 但是,这里有几个关键点需要注意: 1. **UDF的调用语法**:这里使用了`$`符号来调用UDF,这通常不是标准SQL的写法,而是某些特定框架(如DataX或自研数据平台)的模板语法。在实际执行前,框架会解析这些UDF表达式,将其替换为实际的值。 2. **数据类型比较**- 如果`create_dt`字段是字符串类型(VARCHAR),那么直接与格式化后的字符串比较(如"2024-06-04 10:30:45")是可行的,但要注意字符串比较是按字符顺序的,所以格式必须一致(如'2024-01-01'和'2024-1-1'比较就会有问题)。 - 如果`create_dt`是日期/时间类型(如TIMESTAMP),那么将它与一个字符串比较可能会导致隐式换,这可能会影响性能(索引失效)或者因为格式不匹配而出现错误。 3. **时区问题**:`DateUdf.date()`返回的是Java的Date对象(即当前系统默认时区的时间),而数据库中的时间可能是其他时区(如UTC)。如果两者时区不一致,可能会导致删除的数据范围错误。 4. **执行时机**:由于UDF函数`date()`在每次执行时都会获取当前时间,因此这个删除操作的条件是动态的,每次执行都会删除所有创建时间早于当前时刻的记录。但需要注意的是,如果这个SQL是在一个批处理任务中执行,那么在整个任务执行期间,这个条件值不会改变(因为UDF在SQL解析阶段就会被替换为具体的字符串值,而不是在每行删除时都计算一次)。 5. **潜在风险**:这个删除操作没有限定删除的时间范围(比如只删除14天前的数据),而是删除所有早于当前时间的数据,这可能导致大量数据被删除,甚至可能是全部数据(因为当前时间总是比过去的时间晚)。所以需要确认业务逻辑是否确实需要删除所有历史数据?通常我们会保留一定时间的数据。 因此,这个SQL的实际效果是:删除表中所有创建时间(create_dt)早于当前时间(执行SQL时)的记录。但具体执行结果还取决于字段类型和时区设置。 建议:如果业务意图是删除过期的数据(比如只保留最近一段时间的数据),那么应该使用相对时间,比如删除14天前的数据: 原SQL可改为(使用UDF的add方法): delete from ... where create_dt < "$dateUdf.format($dateUdf.add($dateUdf.date(), 5, -14), 'yyyy-MM-dd HH:mm:ss')" 解释:先获取当前时间,然后减去14天(Calendar.DATE字段对应5),再格式化。 但注意,如果create_dt是时间戳类型,更推荐在数据库层面使用时间函数(如`NOW() - INTERVAL '14 DAY'`)以避免类型换和时区问题。 总结:这个SQL利用自定义UDF函数获取当前时间并格式化为字符串,然后删除所有create_dt小于这个字符串的记录。但存在数据类型、时区、性能等潜在问题,需要根据实际情况调整。</think>### UDF函数在SQL中的含义解析 您提供的Java UDF类`DateUdf`是一个**日期时间工具库**,在SQL `delete`语句中的作用是动态生成当前时间的格式化字符串。具体分析如下: #### 1. **SQL语句核心逻辑** ```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')" ``` - **`$dateUdf.date()`** 调用`DateUdf.date()`方法,返回当前时间的`java.util.Date`对象(精确到毫秒) - **`$dateUdf.format(..., 'yyyy-MM-dd HH:mm:ss')`** 将`Date`对象格式化为字符串(如`"2024-06-04 15:30:45"`) - **最终效果** 删除`create_dt`字段值 **早于当前时刻** 的所有记录(相当于删除所有历史数据) #### 2. **关键风险点** - **全表删除风险** 若`create_dt`存储的是过去时间,此操作会删除**全表数据**(因所有记录都满足`< 当前时间`) - **时区陷阱** `DateUdf.date()`使用JVM默认时区(通常为服务器时区),若`create_dt`是UTC时间,可能导致误删新数据 *示例*:北京时间`2024-06-05 08:00:00` = UTC时间`2024-06-05 00:00:00` - **性能瓶颈** 无时间范围限制时,可能触发大事务删除(需确认表数据量级) - **语法兼容性** `$dateUdf`是特定框架(如DataX/Spark)的UDF调用语法,在纯SQL引擎中无法执行 #### 3. **业务场景推测** 该SQL可能用于 **清理过期数据**,但存在设计缺陷。正确做法应指定时间偏移量: ```sql -- 正确示例:删除14天前的数据 where create_dt < "$dateUdf.format( $dateUdf.add($dateUdf.date(), 5, -14), -- Calendar.DATE=5, 减14天 'yyyy-MM-dd HH:mm:ss' )" ``` #### 4. **UDF核心方法说明** | 方法 | 功能 | SQL中调用示例 | |------|------|--------------| | `date()` | 获取当前时间 | `$dateUdf.date()` | | `format(date, pattern)` | 格式化时间 | `$dateUdf.format(..., 'yyyy-MM-dd')` | | `add(date, field, offset)` | 时间偏移 | `$dateUdf.add(..., 5, -7)` // 减7天 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值