深入了解Java8新特性-日期时间API
阅读建议
嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
- 本篇文章大概2000多字,预计阅读时间长需要3分钟。
- 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
- 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

系列目录
深入了解Java8新特性-日期时间API系列:
- 深入了解Java8新特性-日期时间API:LocalDate类
- 深入了解Java8新特性-日期时间API:LocalTime类
- 深入了解Java8新特性-日期时间API:TemporalQuery类和TemporalQueries类
- 深入了解Java8新特性-日期时间API:TemporalAdjusters类
- 深入了解Java8新特性-日期时间API:ZonedDateTime类和OffsetDateTime类
- 深入了解Java8新特性-日期时间API:Clock类和DateTimeFormatter类
- 深入了解Java8新特性-日期时间API: Year类、YearMonth类、MonthDay类和DayOfWeek类
- 深入了解Java8新特性-日期时间API:ChronoUnit类和ChronoField类
- 深入了解Java8新特性-日期时间API:Period类和Duration类
简单了解一下Java8时间API
Java 8 引入了新的日期和时间API,它是对旧的java.util.Date和java.util.Calendar类的改进,新的时间API在java.time包下,也称为Java时间API,它提供了更简单、更强大和更灵活的日期和时间处理能力。
Java8时间API有哪些显著的特点
新的时日期和时间的API有一些非常显著的特点:
- 不可变性:Java 8的时间API中的类是不可变的,这意味着一旦创建了实例,就不能更改其值。这种不可变性有助于避免错误和简化代码。
- 链式调用:Java 8的时间API支持链式调用,这使得代码更加简洁和易于阅读。
- 时区和区域设置:Java 8的时间API提供了更精细的时区和区域设置控制。它包括一系列的类,如ZoneId、ZoneOffset、LocalDateTime、ZonedDateTime等,用于处理时间和时区的问题。
- 更清晰的日期和时间类型:Java 8的时间API定义了多种日期和时间类型,如LocalDate、LocalTime、LocalDateTime、Year、YearMonth等,每种类型都表示日期和时间的不同方面。
- 日期和时间的解析和格式化:Java 8的时间API提供了强大的日期和时间解析和格式化功能。例如,你可以很容易地将字符串解析为日期或时间,或者将日期或时间格式化为字符串。
- 日期和时间的运算:Java 8的时间API支持日期和时间的运算,如添加时间、获取下一个时间等。这对于日程安排、计划和定时任务是非常有用的。
- 与旧的date/time API的兼容性:Java 8的时间API是向后兼容的,这意味着你可以在使用新的时间API的同时,继续使用旧的java.util.Date和java.util.Calendar类。
Java8时间API包含有哪些核心类
而这引起非常显著的特点是如何体现的呢?这些显著特点就体现在这些新增的类上:
- LocalDate, LocalTime, LocalDateTime: 这些类用于表示日期和时间,它们不可变且线程安全。LocalDate 表示日期,LocalTime 表示时间,LocalDateTime 表示日期和时间。
- ZonedDateTime, OffsetDateTime: 这两个类用于处理具有时区的日期和时间。ZonedDateTime 用于表示具有时区的日期和时间,而 OffsetDateTime 则表示具有偏移量的日期和时间。
- TemporalAdjusters: 这个类提供了一些静态方法,可以调整日期和时间,例如添加工作日、获取下一个工作日等。
- TemporalQuery: 这个接口用于定义查询,可以用于从日期时间对象中提取信息,比如年、月、日等。
- Clock, DateTimeFormatter: Clock 类用于获取当前时间,而 DateTimeFormatter 类则用于日期和时间的格式化和解析。
- Year, YearMonth, MonthDay, DayOfWeek: 这些类用于表示年份、年份和月份、月份和日期以及星期几。
- ChronoUnit: 这个类提供了一些时间单位,例如天、小时、分钟等,可以用于进行时间运算。
- ChronoField: 这个类提供了一些字段,例如年、月、日、时、分、秒等,可以用于获取和设置日期时间的各个部分。
- Period, Duration: Period 类用于表示两个日期之间的时间间隔,而 Duration 类则用于表示两个时间点之间的间隔。
Java旧的日期时间API与Java8的日期时间API对比
Java 8的日期时间API相较于旧的日期时间API有显著的变化和改进,提供了更加现代化、灵活和强大的日期和时间处理能力:
- 新的日期时间API是线程安全的:旧的日期时间API中的大多数类都是可变的,是非线程安全的。而Java 8的日期时间API中的大部分类型都是不可变的,因此是线程安全的。这意味着多个线程可以共享这些类型的实例,而不必担心线程安全问题。
- 新的日期时间API更加合理和统一:旧的日期时间API在设计上存在很多问题,例如在java.util包中有多个日期类,包括java.util.Date、java.sql.Date等,它们的功能和用法都有所不同。此外,用于格式化和解析的类在java.text包中定义,使用起来不够方便。而Java 8的日期时间API的设计更加合理和统一,引入了LocalDate、LocalTime、LocalDateTime等新的日期时间类型,它们的使用更加简单和直观。
- 新的日期时间API支持时区处理:旧的日期时间API中没有提供时区支持,因此在进行跨时区的日期和时间处理时会出现问题。而Java 8的日期时间API引入了全球时区支持,并提供了时区转换的功能。时区转换可以通过ZonedDateTime和OffsetDateTime等类型实现。
- 新的日期时间API支持格式化和解析:Java 8时间API提供了DateTimeFormatter类,用于日期和时间的格式化和解析。DateTimeFormatter类支持多种格式,并可以自定义格式。这使得日期和时间的处理更加灵活和方便。
- 新的日期时间API支持不可变性和线程安全:Java 8时间API中的大部分类型都是不可变的,因此线程安全。这意味着多个线程可以共享这些类型的实例,而不必担心线程安全问题。
总结
Java 8时间API提供了更简单、更强大和更灵活的日期和时间处理能力。Java 8之前的日期和时间处理主要依赖于Date和Calendar类,这些类在使用上存在一些不便,例如需要手动进行时区转换,以及对日期的各种操作(如增加天数、获取下一个工作日等)需要编写较复杂的代码。Java 8引入了新的时间API,包括LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Period、Duration、Clock、DateTimeFormatter等类和接口,它们使得处理日期和时间变得更加简单、直观和灵活。
下面将通过几篇文章和大家一块逐个深入了解一下各个时间API类的关键特性:
- 深入了解Java8新特性-日期时间API:LocalDate类
- 深入了解Java8新特性-日期时间API:LocalTime类
- 深入了解Java8新特性-日期时间API:TemporalQuery类和TemporalQueries类
- 深入了解Java8新特性-日期时间API:TemporalAdjusters类
- 深入了解Java8新特性-日期时间API:ZonedDateTime类和OffsetDateTime类
- 深入了解Java8新特性-日期时间API:Clock类和DateTimeFormatter类
- 深入了解Java8新特性-日期时间API: Year类、YearMonth类、MonthDay类和DayOfWeek类
- 深入了解Java8新特性-日期时间API:ChronoUnit类和ChronoField类
- 深入了解Java8新特性-日期时间API:Period类和Duration类
相关文章:
深入了解Java8新特性-日期时间API
阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2000多字,预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…...
【数据结构】二叉树概念 | 满二叉树 | 完全二叉树
二叉树的概念 二叉树在实践中用的很多。 一棵二叉树是结点的一个有限集合,该集合: 或者为空;由一个根结点加上两棵别称为左子树和右子树的二叉树组成。二叉树最多两个孩子。 这里注意:二叉树并不是度为2的树。 二叉树的度最大值是…...
第 373 场 LeetCode 周赛题解
A 循环移位后的矩阵相似检查 模拟 class Solution { public:bool areSimilar(vector<vector<int>> &mat, int k) {int m mat.size(), n mat[0].size();k % n;auto g mat;for (int i 0; i < m; i)if (i & 1)rotate(mat[i].begin(), mat[i].begin() …...
C#,《小白学程序》第二十五课:大数乘法(BigInteger Multiply)的Karatsuba算法及源代码
1 文本格式 /// <summary> /// 《小白学程序》第二十五课:大数(BigInteger)的Karatsuba乘法 /// Multiplies two bit strings X and Y and returns result as long integer /// </summary> /// <param name"a">&…...
Redis的五大数据类型详细用法
我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。本篇博客我们就将介绍这些数据类型的详细使用…...
C++类与对象(6)—初始化列表、explicit关键字、static成员
目录 一、初始化列表 1、定义 2、注意事项 3、尽量使用初始化列表初始化 4、初始化顺序 二、 explicit关键字 1、定义 2、特点 三、static成员 1、定义 2、特性 3、例题 一、初始化列表 下面这段代码可以正常编译: class A { private:int _a1;//成员…...
vue3+tsx的使用
<template><div><xiaoman on-click"getItem" name"似懂非懂"></xiaoman></div> </template><script setup langts>import xiaoman from "./App"const getItem(item:any)>{console.log(item,it…...
JMeter 设置请求头信息的详细步骤
在使用 JMeter 的过程中,我们会遇到需要设置请求头信息的场景。比如: POST 传过去的 Body 数据是 json 格式的。需要填添加头信息:Content-Type:application/json。 在 header 中用 token 来传用户的认证信息。 下面,…...
从零构建属于自己的GPT系列1:预处理模块
1 训练数据 在本任务的训练数据中,我选择了金庸的15本小说,全部都是txt文件 数据打开后的样子 2 数据预处理 数据预处理需要做的事情就是使用huggingface的transformers包的tokenizer模块,将文本转化为token 最后生成的文件就是train_n…...
002、ArkTS
之——开发语言 目录 之——开发语言 杂谈 正文 1.TypeScript基础 1.1 基础类型 1.2 条件语句 1.3 函数 1.4 类 1.5 模块 1.6 迭代器 2.ArkTS 2.1 JAVA SCRIPT 2.2 TS 2.3 ArkTS 编辑 3.示例 3.1 概述性示例 3.2 自定义组件 3.3 渲染控制语法 3.4 状态管…...
如何通过nginx进行服务的负载均衡
简单介绍 随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障的出现。应用集群是将同一应用部署到多台…...
FPGA程序前仿真和后仿真问题处理
参考链接:FPGA程序前仿真和后仿真问题处理 - 知乎...
C语言WFC绘制矩形
代码实现: void CCGDrawingView::Rectangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, COLORREF color,CDC* pDC) {CPen redPen(PS_SOLID, 1, color);CBrush redBursh(color);CPen* pOldPen pDC->SelectObject(&redPen);CBrush* p…...
SpringCloud Alibaba集成 Gateway(自定义负载均衡器)、Nacos(配置中心、注册中心)、loadbalancer
文章目录 POM依赖环境准备配置配置文件配置类 案例展示 POM依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version><relativePath/></p…...
HarmonyOS应用开发者基础认证【题库答案】
HarmonyOS应用开发者高级认证【题库答案】 一、判断 首选项preferences是以Key-Value形式存储数据,其中Key是可以重复。(错)使用http模块发起网络请求时,必须要使用on(‘headersReceive’)订阅请求头,请…...
[pyqt5]pyqt5设置窗口背景图片后上面所有图片都会变成和背景图片一样
pyqt5的控件所有都是集成widget,窗体设置背景图片后控件背景也会跟着改变,此时有2个办法。第一个办法显然我们可以换成其他方式设置窗口背景图片,而不是使用styleSheet样式表,网上有很多其他方法。还有个办法就是仍然用styleSheet…...
【Docker】从零开始:7.Docker命令:容器命令及参数详解
【Docker】从零开始:7.帮助启动类命令 一、帮助启动类命令启动Docker停止Docker重启Docker查看Docker状态开机启动查看docker概要信息查看docker总体帮助文档查看docker命令帮助文档 二、镜像命令列出本地主机上的镜像运行示例返回说明操作参数 搜索仓库里的某个镜像…...
Mysql 锁机制分析
整体业务代码精简逻辑如下: Transaction public void service(Integer id) {delete(id);insert(id); }数据库实例监控: 当时通过分析上游问题流量限流解决后,后续找时间又重新分析了下问题发生的根本原因,现将其总结如下…...
跟着chatgpt学习|1.spark入门
首先先让chatgpt帮我规划学习路径,使用Markdown格式返回,并转成思维导图的形式 目录 目录 1. 了解spark 1.1 Spark的概念 1.2 Spark的架构 1.3 Spark的基本功能 2.spark中的数据抽象和操作方式 2.1.RDD(弹性分布式数据集) 2…...
使用conan包 - 安装依赖项
使用conan包 - 安装依赖项 主目录 conan Using packages1 Requires2 Optional user/channel3 Overriding requirements4 Generators5 Options 本文是基于对conan官方文档Installing dependencies的翻译而来, 更详细的信息可以去查阅conan官方文档。 This section s…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...

