jdk8时间类

本文详细介绍了Java8中引入的新日期时间API,包括Instant、LocalDateTime、LocalDate、LocalTime、ZoneId、ZoneOffset和ZoneDateTime等类的使用方法,以及如何进行日期类型转换和计算时间差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,时间 类介绍

现有API存在的问题

线程安全: Date和Calendar不是线程安全的,你需要编写额外的代码处理线程安全问题

API设计和易用性: 由于Date和Calendar的设计不当你无法完成日常的日期操作

ZonedDate和Time: 你必须编写额外的逻辑处理时区和那些旧的逻辑

好在JSR 310规范中为Java8添加了新的API, 在java.time包中,新的API纠正了过去的缺陷

新的日期API

jdk8中表示的类有多个,主要的有:

 

作用备注
Instant表示时刻对应jdk7之前的Date,可通过Epoch Time 纪元时相互转换,用来表示时间线上的一个点。
LocalDateTime获取当前系统的日期时间(内部不记录时区)可以认为由LocalDate和LocalTime组成,表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
LocalDate获取当前系统的日期表示没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime获取当前系统的时间表示没有时区的时间, LocalTime是不可变并且线程安全的
ZoneId时区,"+01:00"和"Europe/Paris"时区ID,用来确定Instant和LocalDateTime互相转换的规则,ZoneId除了处理与标准时间的时间差还处理地区时(夏令时,冬令时等)
ZoneOffset时区,只处理 "+01:00"ZoneOffset是ZoneId的子类,只处理与格林尼治的时间差
ZoneDateTime特定时区的日期和时间LocalDateTime内部不记录时区,ZoneDateTime记录

二、时间类示例 

Instant

代码示例

       Instant instant = Instant.now();
       System.out.println(instant);

运行结果

 

LocalDateTime

代码示例

        // 直接获取
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        //指定年月日获取
        LocalDateTime localDateTime1 = LocalDateTime.of(2019,2,15,20,20);
        System.out.println(localDateTime1);
        //  同时LocalDateTime有很多方法:例如单独获取年\月\日\小时\分钟\周几
        int year = localDateTime.getYear();
        System.out.println(year);
        int dayOfYear = localDateTime.getDayOfYear();
        System.out.println(dayOfYear);
        DayOfWeek dayofWeek = localDateTime.getDayOfWeek();
        System.out.println(dayofWeek);

运行结果

 

 

LocalDate

代码示例

        LocalDate localDate = LocalDate.now();
        System.out.println("localDate: " + localDate);

运行结果

 

三、日期类型转换

代码示例

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String patternString = formatter.format(ZonedDateTime.now());
        System.out.println(patternString);

运行结果:(在代码中定义时间的样式,就可以转换成自己想要的。)

四、时间差

代码示例

//        Period表示日期之间得差(年月日),包含to* 方法将差值转成*
//        Duration表示时间差(日时分秒),包含to* 方法将差值转成*
        Period period = Period.between(LocalDate.of(2009, 9, 1), LocalDate.of(2019, 8, 1));
        System.out.println(period.getYears());
        Duration duration = Duration.between(LocalTime.of(10,10),LocalTime.now());
        System.out.println(duration.getSeconds());

运行结果 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值