当前位置 博文首页 > 龚厂长的博客:java8 详解时间日期API
在使用java8以前的时间日期类的时候,总觉得这一块有点蹩脚:
还有一些其他的问题我不再一一说明了,下面是从网上找到的关于时间日期类的问题总结:
java8对时间日期类进行了重新设计,将这些类都放在了 java.time包和其子包下,并做出了一下改进:
下表是java8中主要的日期时间类:
类 | 作用 |
---|---|
LocalDate | 本地日期,没有时区信息 |
LocalTime | 本地时间,没有时区信息 |
LocalDateTime | 本地日期时间,是上面两个类的集合,没有时区信息 |
TemporalAdjuster | 调整日期工具类,比如获取下一日 |
Duration | 计算两个时间的时间间隔 |
Period | 计算两个日期的时间间隔 |
Instant | 记录瞬时时间,没有时区信息 |
Clock | 时钟类,包含有时区信息 |
ZonedDate | 日期类,包含有时区信息 |
ZonedTime | 时间类,包含有时区信息 |
ZonedDateTime | 日期时间类,包含有时区信息 |
ZoneId | 时区类 |
DateTimeFormatter | 日期时间格式化类,功能类似于SimpleDateFormat |
接下来按照上表的顺序一一介绍每个类。
这三个类没有时区信息,表示的是本地时间或者日期。
这三个类将构造方法都设为private,因此都不能通过new关键字创建对象。为了获取对象,它们都提供了相似的静态方法。
Clock.systemDefaultZone()
完成的,也可以指定参数来获取指定时区或者指定时间日期的对象;注意:这三个类都是不可变对象,修改时间日期的任何一个部分都会新建对象。
除了静态方法之外,还有以下实例方法:
下面以LocalDateTime为例,介绍这些方法的使用:
public static void main(String argv[]){
//获取当前时间
LocalDateTime now= LocalDateTime.now();
System.out.println(now);
LocalDateTime parseDate= LocalDateTime.parse("2021-01-01T00:00:01");
System.out.println(parseDate);
//获取2021-01-01T00:01:01
LocalDateTime ofDate= LocalDateTime.of(2021,1,1,0,1,1);
System.out.println(ofDate);
LocalDateTime ofDate1= LocalDateTime.of(LocalDate.now(), LocalTime.now());
System.out.println(ofDate1);
LocalDateTime firstDay=now.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(firstDay==now);
LocalDateTime addOneDay=now.plusDays(1);
System.out.println(addOneDay);
System.out.println(now.format(DateTimeFormatter.ofPattern("yyyy_MM_dd hh:mm:ss")));
}
运行结果为:
2021-01-13T21:15:37.980
2021-01-01T00:00:01
2021-01-01T00:01:01
2021-01-13T21:15:38.091
false
2021-01-14T21:15:37.980
2021_01_13 09:15:37
该类用于调整时间日期,可以在当前对象的基础上调整到本月的第一个天或者下个星期。
该类可以让我们更加灵活方便的调整时间日期。注意该类是一个接口,不过java为我们提供了TemporalAdjusters工具类可以直接获取TemporalAdjuster对象。
public static void main(String argv[]){
//获取当前时间
LocalDateTime now= LocalDateTime.now();
System.out.println(now);
//调整为本月的第一天
System.out.println(now.with(TemporalAdjusters.firstDayOfMonth()));
//调整为下个月的第一天
System.out.println(now.with(TemporalAdjusters.firstDayOfNextMonth()));
//调整到下个星期五
System.out.println(now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));
//如果TemporalAdjusters不能满足功能,可以创建TemporalAdjuster对象
//下面实现一个对象,用于调整当前时间到5个小时之后
System.out.println(now.with(new TemporalAdjuster(){
//TemporalAdjuster接口只有这一个方法
public Temporal adjustInto(Temporal temporal){
if(temporal instanceof LocalDate) {
return temporal;//日期对象无法调整
}
else if(temporal instanceof LocalTime) {
LocalTime time=(LocalTime)temporal;
return time.plusHours(5);
}else if(temporal instanceof LocalDateTime){
LocalDateTime time=(LocalDateTime)temporal;
return time.plusHours(5);
}
return temporal;
}
}));
}
运行结果为:
2021-01-13T21:37:00.536
2021-01-01T21:37:00.536
2021-02-01T21:37:00.536
2021-01-15T21:37:00.536
2021-01-14T02:37:00.536
该类表示一个时间间隔,时间间隔会转换为秒和纳秒存储在Duration对象中。
常用方法有:
以上三个方法是静态方法,下面的方法是实例方法;
public static void main(String argv[]){
Duration dayDuration=Duration.ofDays(1);
System.out.println(dayDuration);
Duration minutesDuration=Duration.ofMinutes(1);
System.out.println(minutesDuration);
//字符串的格式为PnDTnHnMn.nS
Duration parseDuration=Duration.parse("P1DT1H1M1.1S");
System.out.println(parseDuration);
//获取当前时间
LocalDateTime now= LocalDateTime.now();
System.out.println(now);
//一个小时后的时间
LocalDateTime oneHour= now.plusHours(1);
System.out.println(oneHour);
Duration betweenDuration=Duration.between(now,oneHour);
System.out.println(betweenDuration);
//一分钟加上13秒
System.out.println(minutesDuration.plusSeconds(13));
//一分钟加上13秒转换成毫秒
System.out.println(minutesDuration.plusSeconds(13).toMillis());
}
运行结果为:
PT24H
PT1M
PT25H1M1.1S
2021-01-13T22:09:02.874
2021-01-13T23:09:02.874
PT1H
PT1M13S
73000
如果将Duration.between()方法的入参对象换成LocalDate:
public static void main(String argv[]){
//获取当前时间
LocalDate now= LocalDate.now();
System.out.println(now);
//一个小时后的时间
LocalDate oneDay= now.plusDays(1);
System.out.println(oneDay);
Duration betweenDuration=Duration.between(now,oneDay)