Java8日期和时间处理

1.java8新特性-新时间与日期API本地时间与时间戳

LocalDateLocalTimeLocalDateTime类的实例是不可变的对象,分别表示使用ISO-8601的日历系统的日期、时间、日期和时间。新的API提供了简单的日期和时间的获取方法。不包含与时区有关的信息

1.1 使用静态方法now获取本地时间

1
2
3
4
5
6
LocalDate now = LocalDate.now();
System.out.println("获取系统的日期:"+now);// 2020-05-25
LocalTime localTime = LocalTime.now();
System.out.println("获取系统的时间:"+localTime);//20:32:55.091
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("获取系统的日期和时间:"+localDateTime);//2020-05-25T20:32:55.092

1.2 使用静态方法of获取日期和时间

1
2
3
4
5
6
LocalDate localDate = LocalDate.of(2012, 3, 23);
System.out.println(localDate);//2012-03-23
LocalTime localTime = LocalTime.of(12, 12);
System.out.println(localTime);//12:12
LocalDateTime localDateTime = LocalDateTime.of(2012, 3, 24, 12, 12, 12);
System.out.println(localDateTime);//2012-03-24T12:12:12

1.3 plusDays、plusWeeks、plusMonths、plusYear向当前LocalDate对象添加几天、几周、几个月、几年

1
2
3
4
5
6
7
8
9
10
LocalDate localDate = LocalDate.now();
System.out.println(localDate);//2020-05-25
LocalDate localDate1 = localDate.plusDays(2L);
System.out.println(localDate1);//2020-05-27
LocalDate localDate2 = localDate.plusMonths(2L);
System.out.println(localDate2);//2020-07-25
LocalDate localDate3 = localDate.plusWeeks(2L);
System.out.println(localDate3);//2020-06-08
LocalDate localDate4 = localDate.plusYears(2L);
System.out.println(localDate4);//2022-05-25

1.4 Instant时间戳

时间戳(以Unix元年:1970年1月1日00:00:00到某个时间之间的毫秒值)

1
2
3
4
5
6
7
8
9
//默认获取的是以UTC时区
Instant now = Instant.now();
System.out.println(now);//2020-05-25T13:32:32.718Z
//对时间进行偏移量处理,以便获取当前所在时区的时间
OffsetDateTime offsetDateTime=now.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2020-05-25T21:32:32.718+08:00
//把获取的时间转换成对应的毫秒值
long l = now.toEpochMilli();
System.out.println(l);//1590413552718

1.5 Duration计算两个时间之间的间隔,Period计算两个日期之间的间隔

DurationPeriod的使用方式相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Instant now = Instant.now();
try {
//用线程睡眠一秒钟来测试Duration的时间差
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant now2 = Instant.now();
//比较两个时间的间隔
Duration duration = Duration.between(now, now2);
//默认输出`PT1.002S`为ISO-861的表示方法
System.out.println(duration);
//将ISO的表示的方法转换为纳秒、或者毫秒值
long l = duration.toNanos();//1002000000
//转换为毫秒值
//long l1 = duration.toMillis();
System.out.println(l);
//System.out.println(l1);

2.java8新特性-新时间与日期API-时间校正器

TemporalAdjuster:时间校正器。有时候我们需要获取例如:将日期调整到“下周日”等操作。
TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//2020-05-25T22:00:35.532
//获取下一个周日
LocalDateTime dateTime = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(dateTime);//2020-05-31T22:00:35.532
//自定义:下一个工作日是什么时候
LocalDateTime with = ldt.with(l -> {
LocalDateTime ldt4 = (LocalDateTime) l;
//获取今天是星期几
DayOfWeek dayOfWeek = ldt4.getDayOfWeek();
System.out.println(dayOfWeek);//MONDAY
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
return ldt4.plusDays(3L);
} else if (dayOfWeek.equals(DayOfWeek.SUNDAY)) {
return ldt4.plusDays(2L);
} else {
return ldt4.plusDays(1L);
}
});
System.out.println(with);//2020-05-26T22:06:51.576

3.java8新特性-新时间与日期API-时间格式化与时区处理

3.1时间和日期的格式化

1
2
3
4
5
6
7
8
9
DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE;
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
String format = now.format(isoLocalDate);//2020-05-25T22:22:48.083
System.out.println(format);//2020-05-25
//定义自己的格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String format1 = dateTimeFormatter.format(now);
System.out.println(format1);//2020年05月25日

3.2 时区的处理

java8中加入了对时区的支持,带时区的时间分别为ZonedDate,ZonedTIme,ZoneDateTime。其中每个时区都对应着ID,地区ID都是区域/城市的格式,例如:Asia/Shanghai等。
ZoneId该类中包含了所有的时区信息:
getAvailableZoneIds():可以获取所有时区的信息
of(id):用指定的时区信息获取ZoneId对象

1
2
3
4
5
6
7
8
9
10
//获取所有的时区
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
availableZoneIds.forEach(System.out::println);
//获取时区为上海的时间
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));//2020-05-25T22:47:57.216
System.out.println(now);
//也可以使用以下的方法设置时区,返回的是带有时区的时间和日期
LocalDateTime now1 = LocalDateTime.now();
ZonedDateTime zonedDateTime = now1.atZone(ZoneId.of("Asia/Shanghai"));//2020-05-25T22:47:57.222+08:00[Asia/Shanghai]
System.out.println(zonedDateTime);