前言
在工作中,日期处理一直是一个比较麻烦的事情,为此,经常需要写一个DateUtil类专门处理日期。Joda Time提供了一个比较优雅、便捷的日期处理方式。
在一些开源项目中,也经常能看到Joda Time的使用,比如Apache Druid、azkaban等开源项目
介绍
在项目中引入Joda Time方式如下:
maven地址
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
gradle地址
implementation group: 'joda-time', name: 'joda-time', version: '2.12.5'
主要类介绍
DateTime
DateTime是Joda Time中主要使用的类,用来代替java中的Date
Interval
Interval是Joda Time中用来表示一个时间段的类;在一些场景中,我们需要使用一个startTime、endTime时间对的时候,就可以使用Interval
对于Interval的序列化,jackson有一个专门的处理类,序列化跟反序列也十分方便
Period
Period表示一段时间,比如1个月、1天
Period oneHour = Period.hours(1);
Period oneDay = Period.days(1);
Period oneMonty = Period.months(1);
使用场景
获取当前时间
DateTime now1 = new DateTime();
DateTime now2 = DateTime.now();
指定时间初始化
DateTime dateTime1 = DateTime.parse("20230902", DateTimeFormat.forPattern("yyyyMMdd"));// 2023-09-02 00:00:00
DateTime dateTime2 = DateTime.parse("2023-09-03 12:30:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));// 2023-09-03 12:30:00
DateTime dateTime3 = new DateTime(1693152000000L);//2023-08-28 00:00:00
时间偏移
DateTime now = DateTime.parse("2023-12-20 00:00:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));//当前时间:2023-12-20 00:00:00
//往后偏移一小时
DateTime dateTime1 = now.plusHours(1);//2023-12-20 01:00:00
//往后偏移一天
DateTime dateTime2 = now.plusDays(1);//2023-12-21 00:00:00
//往后偏移一周
DateTime dateTime3 = now.plusWeeks(1);//2023-12-27 00:00:00
//往后偏移一月
DateTime dateTime4 = now.plusMonths(1);//2024-01-20 00:00:00
//往后偏移一年
DateTime dateTime5 = now.plusYears(1);//2024-12-20 00:00:00
//往后偏移10秒
DateTime dateTime6 = now.plus(Period.seconds(10));//2023-12-20 00:00:10
//往后偏移1秒
DateTime dateTime7 = now.plus(Duration.millis(1000));//2023-12-20 00:00:01
构造一个时间对
DateTime startTime = DateTime.parse("2023-12-20 00:00:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));//当前时间:2023-12-20 00:00:00
DateTime endTime = startTime.plusDays(1);//2023-12-20 01:00:00
Interval interval = new Interval(startTime, endTime);//"1703001600000-1703088000000"
注:Interval序列化时,可使用jackson内置的序列化方法,可使得格式更加简单
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.1.1</version>
</dependency>
Interval序列化代码如下:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
System.out.println(mapper.writeValueAsString(interval));
时间diff-计算时间差
DateTime dateTime1 = new DateTime(1693152000000L);//2023-08-28 00:00:00
DateTime dateTime2 = DateTime.parse("20240902", DateTimeFormat.forPattern("yyyyMMdd"));// 2024-09-02 00:00:00
Hours hours = Hours.hoursBetween(dateTime1, dateTime2);// 8904 hours
Weeks weeks = Weeks.weeksBetween(dateTime1, dateTime2);// 53 weeks
Months months = Months.monthsBetween(dateTime1, dateTime2);// 12 months
Years years = Years.yearsBetween(dateTime1, dateTime2);// 1 year
System.out.println(hours.getHours());
System.out.println(weeks.getWeeks());
System.out.println(months.getMonths());
System.out.println(years.getYears());
获取月周首天
DateTime dateTime = DateTime.parse("2023-09-02 12:23:25", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));// 2023-09-02 12:23:25
//获取当月最开始时间
DateTime firstDateOfMonth = DateTime.parse(
String.format("%s 00:00:00", dateTime.dayOfMonth().withMinimumValue().toString("yyyy-MM-dd")),
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
);
System.out.println(firstDateOfMonth.toString("yyyy-MM-dd HH:mm:ss"));//2023-09-01 00:00:00
//获取当月最后时间
DateTime lastDateOfMonth = DateTime.parse(
String.format("%s 23:59:59", dateTime.dayOfMonth().withMaximumValue().toString("yyyy-MM-dd")),
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
);
System.out.println(lastDateOfMonth.toString("yyyy-MM-dd HH:mm:ss"));//2023-09-30 23:59:59
//获取当周最开始时间
DateTime firstDateOfWeek = DateTime.parse(
String.format("%s 00:00:00", dateTime.dayOfWeek().withMinimumValue().toString("yyyy-MM-dd")),
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
);
System.out.println(firstDateOfWeek.toString("yyyy-MM-dd HH:mm:ss"));//2023-08-28 00:00:00
//获取当周最后时间
DateTime lastDateOfWeek = DateTime.parse(
String.format("%s 23:59:59", dateTime.dayOfWeek().withMaximumValue().toString("yyyy-MM-dd")),
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
);
System.out.println(lastDateOfWeek.toString("yyyy-MM-dd HH:mm:ss"));//2023-09-03 23:59:59
总结
以上是本人在工作中常用到的一些时间的处理,在此记录一下,希望对大家有帮助。
附录
jodatime官方地址:www.joda.org/joda-time/q…