传统时间格式化的线程安全问题
问题
解决方式
–暂放
新时间内日期API
使用LocalDate,LocalTime,LocalDateTime
实例是不可变对象,分别表示使用ISO-8601日历系统的时日期,时间,日期和时间。他们提供了简单的日期或时间,并不包含当前的事件信息。也不包含与时区相关的信息。
注:ISO-8601日历系统是国际标准化组织定制的现代公民的日期和时间表示法
//1.LocalDate LocalTime LocalDateTime
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt2 = LocalDateTime.of(2021,8,15,21,21,17);
System.out.println(ldt2);
LocalDateTime ldt3 = ldt.plusYears(2);
System.out.println(ldt3);
LocalDateTime ldt4 = ldt.minusMonths(2);
System.out.println(ldt4);
//2.Instant: 时间戳(以1970年1月1日 00:00:00 到某个时间之间的毫秒odt
Instant in = Instant.now(); //默认UTC时区
System.out.println(in);
//加8小时
OffsetDateTime odt = in.atOffset(ZoneOffset.ofHours(8));
System.out.println(odt);
//毫秒值
long l = in.toEpochMilli();
System.out.println(l);
//3.
//Duration : 计算两个时间之间的间隔
Instant ins1 = Instant.now();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant ins2 = Instant.now();
Duration duration = Duration.between(ins1,ins2);
System.out.println(duration.toMillis());
//Period : 计算两个 日期 之间的 间隔
LocalDate localDate1 = LocalDate.of(1995,10,1);
LocalDate now = LocalDate.now();
Period between = Period.between(localDate1, now);
System.out.println(between);
System.out.println(between.getYears());
System.out.println(between.getMonths());
System.out.println(between.getDays());
时间校正器
日期的操作
TemporalAdjuster: 有时需要获取例如:下个周日等操作。
TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.withDayOfMonth(10);
System.out.println(ldt);
System.out.println(ldt2);
//下一个周五
LocalDateTime with = ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println(with);
//自定义:下一个工作日
LocalDateTime ldt3 = ldt.with((l) -> {
LocalDateTime ld = (LocalDateTime) l;
DayOfWeek dow = ld.getDayOfWeek();
if (dow.equals(DayOfWeek.FRIDAY)) {
//周五加三天
return ld.plusDays(3);
} else if (dow.equals(DayOfWeek.SATURDAY)) {
//周六加两天
return ld.plusDays(2);
} else {
return ld.plusDays(1);
}
});
System.out.println(ldt3);
时间格式化与时区的处理
//格式化
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
System.out.println(ldt);
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
String format = ldt.format(dtf2);
System.out.println(format);
//时区
//ZoneDate,ZoneTime,ZoneDateTime
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
availableZoneIds.forEach(System.out::println);
LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Etc/GMT+8"));
System.out.println(localDateTime);
LocalDateTime ldt2 = LocalDateTime.now();
ZonedDateTime zonedDateTime = ldt2.atZone(ZoneId.of("America/Toronto"));
System.out.println(zonedDateTime);