传统的工夫 API 存在线程平安的问题,在多线程开发中必须要上锁,所以 java8 当初为咱们提供了一套全新的工夫日期 API .
这里先给出工夫 API 之间的关系图:
1. LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,别离示意应用 ISO-8601 日历零碎的日期、工夫、日期和工夫。它们提供了简略的日期或工夫,并不蕴含以后的工夫信息。也不蕴含与时区相干的信息。
# LocalDate 是以后日期,LocalTime 是以后工夫,#LocalDateTime 是后面两个的结合体,应用雷同。LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ld2 = LocalDateTime.of(2020, 3, 21, 10, 10, 10);
System.out.println(ld2);
# 能够加日期
LocalDateTime ldt3 = ld2.plusYears(20);
System.out.println(ldt3);
#能够进行减日期
LocalDateTime ldt4 = ld2.minusMonths(2);
System.out.println(ldt4);
# 获取工夫的年、月、日
LocalDateTime now = LocalDateTime.of(2020, 3, 21, 10, 10, 10);
// 获取年
int year = now.getYear();
// 获取月
Month month = now.getMonth();
// 获取月的 value 值
int monthValue = now.getMonthValue();
// 获取在本月的第几天(日)int dayOfMonth = now.getDayOfMonth();
// 获取在本年的第几天
int dayOfYear = now.getDayOfYear();
// 获取在本周的第几天 (星期几)
DayOfWeek dayOfWeek = now.getDayOfWeek();
// 获取小时
int hour = now.getHour();
// 获取分钟
int minute = now.getMinute();
// 获取秒
int second = now.getSecond();
// 获取纳秒
int nano = now.getNano();
2. Instant : 工夫戳。(应用 Unix 元年 1970 年 1 月 1 日 00:00:00 所经验的毫秒值)
Instant ins = Instant.now(); // 默认应用 UTC 时区
System.out.println(ins);
OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));// 增加偏移的时区
System.out.println(odt);
System.out.println(ins.getNano());
System.out.println(ins.toEpochMilli());// 取得工夫戳
Instant ins2 = Instant.ofEpochSecond(5);
System.out.println(ins2);
3. Duration 和 Period
**Duration : 用于计算两个“工夫”距离
Period : 用于计算两个“日期”距离 **
Instant ins1 = Instant.now();
System.out.println("--------------------");
try {Thread.sleep(1000);
} catch (InterruptedException e) { }
Instant ins2 = Instant.now();
System.out.println("所消耗工夫为:" + Duration.between(ins1, ins2));
System.out.println("----------------------------------");
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.of(2020, 3, 26);
Period pe = Period.between(ld2, ld1);
System.out.println(pe.getYears());
System.out.println(pe.getMonths());
System.out.println(pe.getDays());
}
这样取得两个日期之间的距离是被包装成年月日离开的,想要计算两个日期之间的具体总天数,能够应用如下:
LocalDate dateBefore = LocalDate.of(2015,1,20);
LocalDate dateAfter = LocalDate.of(2020,3,25);
long daysBetween = DAYS.between(dateBefore, dateAfter);
System.out.println(daysBetween);
4. emporalAdjuster : 工夫校正器
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// 调整以后的日期为 10 号
LocalDateTime ldt2 = ldt.withDayOfMonth(10);
System.out.println(ldt2);
// 取得下个周日
LocalDateTime ldt3 = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(ldt3);
// 自定义:下一个工作日,工作日是指下一个下班的工夫
LocalDateTime ldt5 = ldt.with((t) -> {LocalDateTime ldt4 = (LocalDateTime) t;
DayOfWeek dow = ldt4.getDayOfWeek();
if(dow.equals(DayOfWeek.FRIDAY)){return ldt4.plusDays(3);
}else if(dow.equals(DayOfWeek.SATURDAY)){return ldt4.plusDays(2);
}else{return ldt4.plusDays(1);
}
});
System.out.println(ldt5);
5. DateTimeFormatter : 解析和格式化日期或工夫
默认曾经有很多种款式
// DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE;
// 能够自定义款式
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日 HH:mm:ss E");
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
// 字符串转回日期. 指定格式化的款式
LocalDateTime newLdt = ldt.parse(strDate, dtf);
System.out.println(newLdt);
6. ZonedDate、ZonedTime、ZonedDateTime:带时区的工夫或日期
// 取得所有的时区
Set<String> ids = ZoneId.getAvailableZoneIds();
ids.forEach(System.out::println);
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
System.out.println(zdt);
7. 与传统日期的转换