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());
}

java8-时间日期API


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());
}

java8-时间日期API


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());
}

java8-时间日期API


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);
}

java8-时间日期API


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"));
}
上一篇:dozer无法映射java8中的LocalDateTime类型的解决方案


下一篇:1046 Shortest Distance (20 分)