在项目开发中,遇到一个类似于 超时关闭的订单(超过1分钟后关闭订单) 的需求,在数据的时间写入时,用的数据库系统的时间函数 SYSDATE , 而在处理超时时间时,用的是 JAVA应用程序时间处理。 在代码评审环节,大佬们给出的意见时,万一出现时间不一致的情况,会产生bug 。要改!统一用一个来源的时间 (统一用数据库时间 or 统一用java应用程序时间 )。
1、 数据写入,用数据库系统时间
insert USER_order (id , lock_time) values ('1', sysdate)
2、超过一分后 时间获取是
new java.util.Date() + 1分钟
由于决定,统一使用 Oracle数据库的时间,那么问题变成: Oracle中时间获取多少分钟后。在Oracle中可以通过SYSDATE获取当前时间,加上组合 INTERVAL 实现时间的偏移量处理,本文将记录 SYSDATE和INTERVAL函数的用法。
从点到线,本文也会记录 在java程序中,获取多少分钟后,获取多少小时后的时间 .
-- oracle 获取当前时间
SELECT
SYSDATE ,
SYSTIMESTAMP
FROM
dual ;
SELECT
SYSDATE
, SYSDATE + INTERVAL '1' YEAR 一年后
, SYSTIMESTAMP + INTERVAL '-1' YEAR "一年前"
FROM
dual ;
SELECT
SYSDATE
, SYSDATE + INTERVAL '1' MONTH
, SYSTIMESTAMP + INTERVAL '-1' MONTH
FROM
dual ;
SELECT
SYSDATE
, SYSDATE + INTERVAL '1' DAY
, SYSTIMESTAMP + INTERVAL '-1' DAY
FROM
dual ;
SELECT
SYSDATE
, SYSDATE + INTERVAL '1' HOUR
, SYSTIMESTAMP + INTERVAL '-1' HOUR
FROM
dual ;
SELECT
SYSDATE
, SYSDATE + INTERVAL '1' MINUTE
, SYSTIMESTAMP + INTERVAL '-1' HOUR
FROM
dual ;
SELECT
SYSDATE
, SYSDATE + INTERVAL '10' SECOND
, SYSTIMESTAMP + INTERVAL '-10' SECOND
FROM
dual ;
org.apache.commons
commons-lang3
3.10
/**
* Description: java日期 多少分钟后/多少天后
* @return void
* @version v1.0
* @author wu
* @date 2023/7/28 18:00
*/
@Test
public void dateAddTimeTest() throws Exception{
final Date date = new Date();
System.out.println("当前时间是:" +DateUtils.format(date,"yyyy-MM-dd HH:mm:ss"));
System.out.println();
// 1、一年后,一年前
final Date date1 = DateUtils.addYears(date, 1);
final Date date2 = DateUtils.addYears(date, -1);
System.out.println("一年后:" +DateUtils.format(date1,"yyyy-MM-dd HH:mm:ss"));
System.out.println("一年前:" +DateUtils.format(date2,"yyyy-MM-dd HH:mm:ss"));
System.out.println();
// 2、一个月
final Date date3 = DateUtils.addMonths(date, 1);
final Date date4 = DateUtils.addMonths(date, -1);
System.out.println("一个月:" +DateUtils.format(date3,"yyyy-MM-dd HH:mm:ss"));
System.out.println("一个月:" +DateUtils.format(date4,"yyyy-MM-dd HH:mm:ss"));
System.out.println();
// 3、一天
final Date date5 = DateUtils.addDays(date, 1);
final Date date6 = DateUtils.addDays(date, -1);
System.out.println("一天后:" +DateUtils.format(date5,"yyyy-MM-dd HH:mm:ss"));
System.out.println("一天前:" +DateUtils.format(date6,"yyyy-MM-dd HH:mm:ss"));
// ignore more DateUtils time test ....
}
当前时间是:2023-07-28 18:23:12
一年后:2024-07-28 18:23:12
一年前:2022-07-28 18:23:12
一个月:2023-08-28 18:23:12
一个月:2023-06-28 18:23:12
一天后:2023-07-29 18:23:12
一天前:2023-07-27 18:23:12
// 注意:拼接成 单引号的字符串 ,具体数值可以改到配置中心
/**
* 过期时间,单位:秒
*/
@Value("${expire.time:60}")
private int expireTime;
String time = "'".concat(String.valueOf(expireTime)).concat("'");
-- myBatis sql 中写法如下
UPDATE USER_order
SET STATUS = '1'
WHERE LOCK_TIME <= SYSDATE+INTERVAL ${time} SECOND
1、Oracle中,实现获取多少时间之后、之前,可以通过 INTERVAL 函数来实现 ,其中 数值 > 0 ,则为之后; 数值 < 0 , 则为之前。
SYSDATE + INTERVAL '10' 单位
单位 可以数值是:
YEAR 年
MONTH 月
DAY 日
HOUR 时
MINUTE 分
SECOND 秒
2、在java程序中,可以使用 DateUtils.addXXX ,实现获取多少时间之前、之后。