java8-时间日期API
1、传统时间格式化的线程安全问题
SimpleDateFormat 是线程不安全的
2、LocalDate , LocalTime, LocalDateTime
public void test(){ //获取当前时间 LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); //获取某个具体的时间 LocalDateTime ldt2 = LocalDateTime.of(2021, 2, 3, 22, 10); System.out.println(ldt2); //年的加减 LocalDateTime ldt3 = ldt.plusYears(1); System.out.println(ldt3); //获取某个时间的年、月、日 System.out.println(ldt.getYear()); System.out.println(ldt.getMonth()); }
3、Instant: 时间戳(以Unix:1970年1月1日00:00:00 到某个时间之间的毫秒值)
@Test public void test2(){ //默认获取 UTC 时区(美国那边的时区) Instant ins1 = Instant.now(); System.out.println(ins1); //标准时区偏移8小时 OffsetDateTime offsetDateTime = ins1.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime); //时间转化为毫秒 System.out.println(ins1.toEpochMilli()); }
4、Duration: 计算两个时间之间的间隔 Period: 计算两个日期之间的间隔
@Test public void test3() throws InterruptedException { Instant ins1 = Instant.now(); Thread.sleep(1000); Instant ins2 = Instant.now(); Duration duration = Duration.between(ins1, ins2); System.out.println("两个时间相差:"+duration.getSeconds()+"s"); LocalDate ld1 = LocalDate.of(2021, 2, 10); LocalDate now = LocalDate.now(); Period between = Period.between(ld1, now); System.out.println(between); System.out.println(between.getDays()); }
5、时间矫正器
TemporalAdjuster:时间矫正器。有时候我们需要获取例如:将日期调整到 ”下个周日“等操作
TemporalAdjusters:该类通过静态方法提供了大量的常用 TemporalAdjuster的实现
例如获取下个周日:
LocalDate nextSunday = LocalDate.now() .with(TemporalAdjusters.next(DayOfWeek.SUNDAY))
public void test1(){ LocalDateTime ldt = LocalDateTime.now(); System.out.println("当前时间为:"+ldt); //求下一个周日 LocalDateTime nextSunday = ldt.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); System.out.println("下一个周日为:"+nextSunday); //自定义: 下一个工作日 // 传进来的参数 l ,其实就是 ldt LocalDateTime nextweekday = ldt.with((l) -> { LocalDateTime local = (LocalDateTime)l; DayOfWeek dayOfWeek = local.getDayOfWeek(); if(dayOfWeek.equals(DayOfWeek.FRIDAY)){ return local.plusDays(3); }else if(dayOfWeek.equals(DayOfWeek.SATURDAY)){ return local.plusDays(2); }else{ return local.plusDays(1); } }); System.out.println(nextweekday); }
6、时间格式化与时区的处理
1) 时间格式化
public void test(){ // 时间转化为固定格式的字符串 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss"); LocalDateTime ldt = LocalDateTime.now(); String result = ldt.format(formatter); System.out.println(result); //固定格式的字符串转化为时间 //这里不知道哪儿出错了... LocalDateTime parse = ldt.parse(result,formatter); System.out.println(parse); }
2)时区处理
//ZoneDate ZoneTime ZoneDateTime @Test public void test1(){ //1、查看所有支持时区 Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); System.out.println(availableZoneIds); //2、创建时间时,指定时区 LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Aden")); //或者 LocalDateTime ldt2 = LocalDateTime.now(); ZonedDateTime zonedDateTime = ldt2.atZone(ZoneId.of("Asia/Aden")); }