JDK8开始新增的日期类

本文将深入解析Java 8中日期和时间API,包括.LocalDate、LocalTime、LocalDateTime、Instant、DateTimeFormatter、Duration和Period,教你如何有效处理时间和日期操作并进行格式转换。

从Java8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:

(1)

LocalDate:不包含具体时间的日期

(2)

LocalTime:不包含日期的时间

(3)

LocalDateTime:包含了日期及时间

(4)

Instant:代表的是时间戳

(5)

DateTimeFormatter:用于做时间的格式化和解析的

(6)

Duration:用于计算两个时间间隔

(7)

Period:用于计算两个日期间隔

### JDK 8 新增时间介绍 JDK 8 引入了一套全新的日期和时间 API,旨在解决旧有 `java.util.Date` 和 `java.util.Calendar` 的不足之处。新引入的位于 `java.time` 包及其子包中,设计更加直观、易用且线程安全[^1]。 #### 主要新增时间概述 ##### 1. **`LocalDate`** 代表不带时区的日期(年-月-日),仅用于处理日期部分而不涉及时间或时区的概念。 ```java // 创建 LocalDate 实例 LocalDate today = LocalDate.now(); System.out.println("Today's Date: " + today); // 自定义日期 LocalDate customDate = LocalDate.of(2023, Month.OCTOBER, 5); System.out.println("Custom Date: " + customDate); ``` 此支持多种方法来获取特定信息,例如年份、月份等,并允许进行加减运算以调整日期[^3]。 ##### 2. **`LocalTime`** 表示不含时区的时间(小时-分钟-秒-纳秒)。它专注于一天内的时刻表达而忽略了具体的日期成分。 ```java // 当前时间 LocalTime now = LocalTime.now(); int hour = now.getHour(); // 获取小时数 int minute = now.getMinute(); // 获取分钟数 System.out.println("Current Time: " + now); ``` 同样具备丰富的操作函数可用于提取各个组成部分或是执行简单的算术变换比如增加减少一定单位长度的时间间隔[^4]。 ##### 3. **`LocalDateTime`** 结合了 `LocalDate` 和 `LocalTime` 功能于一体,既包含了完整的日期也涵盖了精确到纳秒级的时间戳描述形式。 ```java // 组合日期时间和分离它们 LocalDateTime ldt = LocalDateTime.now(); LocalDate ld = ldt.toLocalDate(); LocalTime lt = ldt.toLocalTime(); System.out.println("Full DateTime: " + ldt); System.out.println("Extracted Date: " + ld); System.out.println("Extracted Time: " + lt); ``` 这种型的对象非常适合用来记录事件发生的确切瞬间[^1]. ##### 4. **`Instant`** 专门针对机器友好的瞬态时间节点建模,通常由服务器端应用维护以便跨分布式系统同步状态变化情况下的全局统一计时标准。 ```java // 记录此刻的 Instant 时间点 Instant instant = Instant.now(); long epochSecond = instant.getEpochSecond(); // 秒级别自纪元以来经过了多少整秒 int nanoAdjustment = instant.getNano(); // 纳秒级别的偏移量 System.out.println("Now as an Instant: " + instant); System.out.printf("Seconds since Epoch: %d, Nanos adjustment: %d%n", epochSecond, nanoAdjustment); ``` 由于其内部存储格式基于 Unix 时间戳扩展而来因此特别适合做性能监控统计分析等工作场景下使用. ##### 5. **`Duration` 和 `Period`** 两者都服务于测量两段时间之间的差值区别在于前者适用于衡量较短跨度内持续多久后者则更倾向于长期趋势上的比较如年龄计算等方面的应用价值更大一些. ```java // Duration Example Duration fiveMinutes = Duration.ofMinutes(5); boolean isShorterThanTenMins = fiveMinutes.isLessThan(Duration.ofMinutes(10)); // Period Example LocalDate start = LocalDate.of(2020, 1, 1); LocalDate end = LocalDate.of(2020, 12, 31); Period p = Period.between(start, end); System.out.println(p.getYears() +" years "+p.getMonths()+" months and "+p.getDays()+ " days"); ``` ##### 6. **`DateTimeFormatter`** 提供了灵活的方式来解析与格式化日期字符串,默认情况下遵循 ISO-8601 标准但也可以定制专属模板满足特殊业务需求场合的要求。 ```java String formattedDate = today.format(DateTimeFormatter.ISO_LOCAL_DATE); System.out.println(formattedDate); // Custom pattern example DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); String customFormattedDate = today.format(formatter); System.out.println(customFormattedDate); ``` 综上所述,JDK 8 中的新时间极大地增强了开发者处理复杂日期逻辑的能力同时也提高了代码可读性和可靠性[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值