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

clipboard

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

clipboard

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

clipboard

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

clipboard

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"));
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值