传统的工夫 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);