目录
背景
集成使用
排雷专区:
在计算订单过期时间,根据时间偏移量,和当前时间比对,来执行之后的业务逻辑。
- 未支付订单,定期扫描,1个小时后,自动取消支付并回滚库存;
- 订单退货发起申请,7天内没有退货,商家拒绝退货退款。hutool时间工具类,就排上用场了。
cn.hutool
hutool-all
4.5.7
package com.test.demo;
import cn.hutool.core.date.*;
import org.junit.Test;
import java.util.Calendar;
import java.util.Date;
/**
* @ClassName: DateOffset
* @description: 时间偏移量
* @author: yz
* @create: 2022-07-20 14:58
* @Version 1.0
*/
public class DateOffset {
@Test
public void dateUtil() {
System.out.println("------------------获取当前时间,格式为:(yyyy-MM-dd HH:mm:ss)--------------------------------");
//获取当前时间:2022-07-20 16:04:47
Date date = DateUtil.date();
//Calendar类型转Date类型:2022-07-20 16:04:47
Date date1 = DateUtil.date(Calendar.getInstance());
//时间戳转date:2022-07-20 16:04:47
Date date2 = DateUtil.date(System.currentTimeMillis());
System.out.println("------------------获取当前时间字符串--------------------------------");
//当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
String now = DateUtil.now(); // 2022-07-20 16:04:47
//当前日期字符串,格式:yyyy-MM-dd
String today = DateUtil.today(); // 2022-07-20
System.out.println("------------------Date类型格式化成字符串时间--------------------------------");
// 格式化为指定格式的字符串
String formatDate = DateUtil.format(date, "yyyy/MM/dd");//结果:2022/07/20
// 格式化为时间为日期字符串
String formatDate1 = DateUtil.formatDate(date);//2022-07-20
//时间转化为Strng类型
String dateTime = DateUtil.formatDateTime(date2);//2022-07-20 16:20:26
//时间转化时间字符串
String time = DateUtil.formatTime(date1); //16:25:27
System.out.println("------------------获取指定日期的年月日信息--------------------------------");
//获取年份
int year = DateUtil.year(date);
//获取月份,从0开始计算,需要对结果加一
int month = DateUtil.month(date) + 1;
//当前时间的昨天
DateTime yesterday = DateUtil.yesterday();
System.out.println("------------------获取某天/某月的开始或结束时间--------------------------------");
//一天的开始时间:2022-07-20 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);
//一天的结束时间
Date endOfDay = DateUtil.endOfDay(date);
//当月的开始时间
Date beginOfMonth = DateUtil.beginOfMonth(date);
//当月的结束时间
Date endOfMonth = DateUtil.endOfMonth(date);
//当前年份的最后一天
Date endOfYear = DateUtil.endOfYear(date);
System.out.println("------------------获取时间偏移(向前或向后)--------------------------------");
//当前时间推迟一天:2022-07-21 17:16:42
Date offset = DateUtil.offset(date1, DateField.DAY_OF_MONTH, 1);
//当前推迟一天:2022-07-21 17:16:42
Date offsetMonth = DateUtil.offsetDay(date2, 1);
//推迟一天
Date offset3 = DateUtil.offset(date, DateField.DAY_OF_YEAR, 1);
//推迟一天
Date offset4 = DateUtil.offset(date, DateField.DAY_OF_WEEK, 1);
//提前一天:2022-07-19 17:16:42
Date offset1 = DateUtil.offset(date, DateField.DAY_OF_MONTH, -1);
//当前推迟2个月:2022-09-20 17:19:47
Date offset2 = DateUtil.offset(date1, DateField.MONTH, 2);
//当前推迟2个月:2022-09-20 17:19:47
Date offsetMonth1 = DateUtil.offsetMonth(date1, 2);
//延长30s:2022-07-20 17:24:38
Date offset5 = DateUtil.offsetSecond(date, 30);
//延长2个小时;2022-07-20 19:36:42
Date offsetHour = DateUtil.offsetHour(date, 2);
//延长2个小时;2022-07-20 19:36:42
Date offsetHour1 = DateUtil.offset(date, DateField.HOUR, 2);
//延长2个小时;2022-07-20 19:36:42
Date offsetHour2 = DateUtil.offset(date, DateField.HOUR_OF_DAY, 2);
//明天
Date tomorrow = DateUtil.tomorrow();
//上周
Date Date = DateUtil.lastWeek();
//下周
Date Date1 = DateUtil.nextWeek();
//上个月
Date Date2 = DateUtil.lastMonth();
//下个月
Date Date3 = DateUtil.nextMonth();
System.out.println("------------------between获取日期天数差和小时差--------------------------------");
//两个时间段相差的天数:0
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
//两个时间段相差的小时:当前比明天相差24小时
long betweenHour = DateUtil.between(date1, offset, DateUnit.HOUR);
//当前距离下一月相差几周:4
long weekHour = DateUtil.between(date1, Date3, DateUnit.WEEK);
long betweenDay2 = DateUtil.between(date, offsetHour2, DateUnit.MS);//7200000
//时间差格式化:截取相应时段
String formatBetween = DateUtil.formatBetween(betweenDay2, BetweenFormater.Level.HOUR);//2小时
DateTime parse = DateUtil.parse("2022-07-21 10:05:22");
DateTime parse1 = DateUtil.parse("2022-07-21 12:15:32");
String formatBetween2 = DateUtil.formatBetween(parse, parse1, BetweenFormater.Level.MINUTE);//2小时10分
String formatBetween3 = DateUtil.formatBetween(parse, parse1, BetweenFormater.Level.SECOND);//2小时10分10秒
String formatBetween4 = DateUtil.formatBetween(parse, parse1, BetweenFormater.Level.DAY);//0天
System.out.println("------------------其他--------------------------------");
//根据出生日期计算年龄
int ageOfNow = DateUtil.ageOfNow("1992-01-13"); //30
//某年是否为闰年
boolean leapYear = DateUtil.isLeapYear(2004); //true
}
}
- 获取当前时间的方法,默认格式为yyyy-MM-dd HH:mm:ss,这样输出的结果一样。
public static void main(String[] args) {
Date date = DateUtil.date();
//Calendar类型
Date date1 = DateUtil.date(Calendar.getInstance());
//时间戳转date
Date date2 = DateUtil.date(System.currentTimeMillis());
System.out.println(date);
System.out.println(date1);
System.out.println(date2);
}
2.针对1中,格式化到ms级别,即格式为:yyyy-MM-dd HH:mm:ss.SSSSSS,数据是有差别的。
public static void main(String[] args) {
Date date = DateUtil.date();
//Calendar类型
Date date1 = DateUtil.date(Calendar.getInstance());
//时间戳转date
Date date2 = DateUtil.date(System.currentTimeMillis());
String format = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSSSSS");
String format1 = DateUtil.format(date1, "yyyy-MM-dd HH:mm:ss.SSSSSS");
String format2 = DateUtil.format(date2, "yyyy-MM-dd HH:mm:ss.SSSSSS");
System.out.println(format);
System.out.println(format1);
System.out.println(format2);
}
3.基于2,产生了下面的问题:
两种方法获取当前时间,date1,date2,然后对时间进行延长2个小时处理,生成offsetHour1,offsetHour2;那么目前data1=date2,offsetHour1=offsetHour2
现在我想看看时间是不是差二个小时?
我用DateUtil.between()函数:
首先DateUtil.between(date1, offsetHour1, DateUnit.MS);前两个参数分别是date1以及它所推迟的时间offsetHour1,输出正常;
因为offsetHour1=offsetHour2,那么我把上述第二个参数换成offsetHour2,应该也是一样的结果,结果是不一样的;
同样我把第一个参数改成date2,第二个参数还是offsetHour1,结果也是错误的;
上述和第三个参数无关。
问题原因就是:它们产生的毫秒级数据结果,实际是不相同的,所以产生的产值会不同。
public static void main(String[] args) {
Date date1 = DateUtil.date(Calendar.getInstance());
Date date2 = DateUtil.date();
//将时间推迟2个小时
Date offsetHour1 = DateUtil.offsetHour(date1, 2);
Date offsetHour2 = DateUtil.offsetHour(date2, 2);
System.out.println("方法一输出当前时间:" + date1);
System.out.println("方法二输出当前时间:" + date2);
System.out.println("方法一输出推迟时间:" + offsetHour1);
System.out.println("方法二输出推迟时间:" + offsetHour2);
//正常的差值
long betweenDay = DateUtil.between(date1, offsetHour1, DateUnit.MS);
long betweenDay1 = DateUtil.between(date1, offsetHour2, DateUnit.MS);
long betweenDay2 = DateUtil.between(date2, offsetHour1, DateUnit.MS);
long betweenDay5 = DateUtil.between(date2, offsetHour1, DateUnit.SECOND);
System.out.println("正常的差值-时间差精确到豪秒:" + betweenDay);
System.out.println("时间差精确到豪秒:" + betweenDay1);
System.out.println("时间差精确到豪秒:" + betweenDay2);
System.out.println("时间差精确到秒:" + betweenDay5);
}
4.基于3,正常的差值方法应该是: DateUtil.between(参数1,参数2,参数3),参数2应该和参数1紧密相关,也就是参数2是在参数1的基础上生成的,其中参数1和参数2位置可以互换不影响实际结果。
public static void main(String[] args) {
Date date1 = DateUtil.date(Calendar.getInstance());
Date date2 = DateUtil.date();
//将时间推迟2个小时
Date offsetHour1 = DateUtil.offsetHour(date1, 2);
Date offsetHour2 = DateUtil.offsetHour(date2, 2);
System.out.println("方法一输出当前时间:" + date1);
System.out.println("方法二输出当前时间:" + date2);
System.out.println("方法一输出推迟时间:" + offsetHour1);
System.out.println("方法二输出推迟时间:" + offsetHour2);
long betweenDay = DateUtil.between(date1, offsetHour1, DateUnit.MS);
long betweenDay1 = DateUtil.between(date2, offsetHour2, DateUnit.MS);
long betweenDay2 = DateUtil.between(offsetHour2, date2, DateUnit.MS);
long betweenDay5 = DateUtil.between(date2, offsetHour2, DateUnit.SECOND);
System.out.println("正常的差值-时间差精确到豪秒:" + betweenDay);
System.out.println("时间差精确到豪秒:" + betweenDay1);
System.out.println("时间差精确到豪秒:" + betweenDay2);
System.out.println("时间差精确到秒:" + betweenDay5);
}