1.介绍
在JDK1.8之前,处理日期和时间的方式比较单一,Java中提供了Calendar来处理日期,但是过程较为繁琐,但是在JDK1.8之后,Java更新了time包提供了LocalDate,LocalTime,LocalDateTime等日期时间类来处理较为复杂的关于日期和时间的业务逻辑的方法。
现有的类(例如java.util.Date和SimpleDateFormatter)是非线程安全的,从而导致用户潜在的并发问题,这不是一般开发人员在编写日期处理代码时会期望处理的问题。
joda Time工具类是值得推荐使用的,其原因在于高效和安全。
2.使用
2.1 引入依赖
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.0</version>
</dependency>
3.工具类
3.1.DateTime - 不可变的类,用来替换JDK的Calendar类
(1).api:https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html
(2).常用方法
- 构造DateTime对象
//构造当前时间
DateTime d1=new DateTime();
DateTime d2=DateTime.now();
//构造指定时间
DateTime d3=new DateTime("2021-01-05T11:36:12");
DateTime d4=new DateTime("2021-01-05");
DateTime d5=new DateTime(1578197532000L);
- 字符串转时间
//字符串转时间
String time="2020-01-05 12:12:12";
DateTimeFormatter forPattern = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime d5=DateTime.parse(time, forPattern);
DateTime d6=forPattern.parseDateTime(time);
- 字符串转时间戳
String time="2020-01-05 12:12:12";
DateTimeFormatter forPattern = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
Long time1=DateTime.parse(time, forPattern).toDate().getTime();
Long time2=forPattern.parseDateTime(time).toDate().getTime();
Long time3=forPattern.parseDateTime(time).getMillis();
- 时间转字符串
DateTime date=DateTime.now();
String time=date.toString("yyyy-MM-dd HH:mm:ss");
- 时间戳转时间
Long time =1578197532000L;
DateTime date=new DateTime(time);
- 加减
DateTime date=DateTime.now();
//加一年
date.plusYears(1);
//减一年
date.minusYears(1);
//加一天
date.plusDays(1);
//减一天
date.minusDays(1);
date.plusHours(1);
- 获取一天的开始时间和结束时间
DateTime date=DateTime.now();
//最小时间
DateTime start1=date.withTimeAtStartOfDay();
DateTime start2=date.millisOfDay().withMinimumValue();
//最大时间
DateTime end=date.millisOfDay().withMaximumValue();
- 两个日期相差多少天,多少月,多少年
DateTime start=new DateTime("2018-12-01");
DateTime end= DateTime.now();
int days = Days.daysBetween(start, end).getDays();
int months = Months.monthsBetween(start, end).getMonths();
int years = Years.yearsBetween(start, end).getYears();
3.2.Instant - 不可变的类,用来表示时间轴上一个瞬时的点
Instant比较适合用来表示一个事件发生的时间戳。不用去关心它使用的日历系统或者是所在的时区(该类中使用1970-01-01 00:00:00开始到未来某一刻的的毫秒总数。)
(1)api
- 初始化,获取当前系统的毫秒时间的Instant对象
Instant instant=Instant.now();
- 获取瞬间的毫秒数
Instant.now().getMillis()
- 转DateTime
Instant.now().toDateTime()
- 当前加时间戳
Instant.now().plus(1111111L)
- 当前减时间戳
Instant.now().minus(1111111L)
- 字符串转Instant
Instant.parse("2020-12-12")
3.3.LocalDate - 不可变的类,表示一个本地的日期,而不包含时间部分(没有时区信息)
LocalDate、LocalTime、LocalDateTime方法都是类似的
(1).常用方法
- 初始化
//当前日期
LocalDate localDate = LocalDate.now();
//指定日期
LocalDate myDate = LocalDate.parse("2020-12-12");
- 获取日期详情
//获取年
getYear();
//获取月
getMonthOfYear();
//获取天
getDayOfMonth();
- 日期比较
//是的相等
equals();
//是否晚于
isAfter();
//比较
compareTo();
3.4.LocalTime - 不可变的类,表示一个本地的时间,而不包含日期部分(没有时区信息)
3.5.LocalDateTime - 不可变的类,表示一个本地的日期-时间(没有时区信息)