时间处理的未来:Java 8全新日期与时间API完全解析

在这里插入图片描述

文章目录

    • 一、改进背景
    • 二、本地日期时间
    • 三、时区日期时间
    • 四、格式化

一、改进背景

Java 8针对时间处理进行了全面的改进,重新设计了所有日期时间、日历及时区相关的 API。并把它们都统一放置在 java.time 包和子包下。

Java5的不足之处

  1. 非线程安全java.util.Date 并不是线程安全的,在使用这个类时必须自己处理多线程并发问题。
  2. 设计不佳 :日期和日期格式化分布在多个包中,java.util.Date 的默认日期,年是从1900开始,月从 1 开始,日从 0 开始,没有统一性。而且 Date 类也缺少直接操作日期的相关方法。
  3. 时区处理困难:因为设计不佳,不得不编写大量代码来处理时区问题。

Java8的改进方案

  1. 线程安全:新的日期时间API是线程安全的不仅没有setter方法,而且任何对实例的变更都会返回一个新的实例而保证原来的实例不变。
  2. 日期修改:新的日期时间API提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例。
  3. : 在时区方面,新的日期时间API引入了域这个概念。
  4. 组合拆分:针对原来复杂的 API 进行重新组合和拆分,分成了好多个类。

二、本地日期时间

  1. LocalDate: 用于表示不含时区的日期,例如:2024-07-06。

    import java.time.LocalDate;
    import java.time.Month;public class LocalDateExample {public static void main(String[] args) {// 获取当前日期LocalDate today = LocalDate.now();System.out.println("当前日期: " + today);// 创建指定日期LocalDate specificDate = LocalDate.of(2024, Month.JULY, 6);System.out.println("指定日期: " + specificDate);// 日期操作示例LocalDate tomorrow = today.plusDays(1);System.out.println("明天的日期: " + tomorrow);}
    }// 输出
    当前日期: 2024-07-06
    指定日期: 2024-07-06
    明天的日期: 2024-07-07
    
  2. LocalTime: 用于表示不含时区的时间,例如:10:30:15.。

    import java.time.LocalTime;public class LocalTimeExample {public static void main(String[] args) {// 获取当前时间LocalTime currentTime = LocalTime.now();System.out.println("当前时间: " + currentTime);// 创建指定时间LocalTime specificTime = LocalTime.of(14, 30, 45);System.out.println("指定时间: " + specificTime);// 时间操作示例LocalTime laterTime = currentTime.plusHours(2);System.out.println("两小时后的时间: " + laterTime);}
    }// 输出
    当前时间: 19:44:24.397
    指定时间: 14:30:45
    两小时后的时间: 21:44:24.397
    
  3. LocalDateTime: 用于表示不含时区的日期时间,例如:2024-07-06T10:30:15。

    import java.time.LocalDateTime;
    import java.time.Month;public class LocalDateTimeExample {public static void main(String[] args) {// 获取当前日期时间LocalDateTime currentDateTime = LocalDateTime.now();System.out.println("当前日期时间: " + currentDateTime);// 创建指定日期时间LocalDateTime specificDateTime = LocalDateTime.of(2024, Month.JULY, 6, 14, 30, 45);System.out.println("指定日期时间: " + specificDateTime);// 日期时间操作示例LocalDateTime laterDateTime = currentDateTime.plusDays(1).plusHours(2);System.out.println("明天两小时后的日期时间: " + laterDateTime);}
    }// 输出
    当前日期时间: 2024-07-06T19:45:55.358
    指定日期时间: 2024-07-06T14:30:45
    明天两小时后的日期时间: 2024-07-07T21:45:55.358
    

三、时区日期时间

在Java 8的新日期时间API中,除了处理本地日期时间外,还引入了处理时区日期时间的类,主要是 ZonedDateTimeZoneId

  1. ZonedDateTime :处理带时区的日期时间的类,它包含了本地日期时间和对应的时区信息。
import java.time.*;public class ZonedDateTimeExample {public static void main(String[] args) {// 获取当前日期时间LocalDateTime localDateTime = LocalDateTime.now();// 创建 ZonedDateTime 对象// 时区IDZoneId zoneId = ZoneId.of("Asia/Shanghai");ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);System.out.println("当前日期时间和时区: " + zonedDateTime);// 获取其它时区的日期时间ZoneId newYorkZoneId = ZoneId.of("America/New_York");ZonedDateTime newYorkDateTime = zonedDateTime.withZoneSameInstant(newYorkZoneId);System.out.println("纽约的日期时间: " + newYorkDateTime);// 当前的日期时间ZonedDateTime now = ZonedDateTime.now();System.out.println("当前日期时间是:" + now);System.out.println("当前时区是: " + now.getZone());LocalDate date = now.toLocalDate();System.out.println("本地日期是:" + now);LocalTime time = now.toLocalTime();System.out.println("本地时间是:" + time);}
}// 输出
当前日期时间和时区: 2024-07-06T20:07:56.439+08:00[Asia/Shanghai]
纽约的日期时间: 2024-07-06T08:07:56.439-04:00[America/New_York]
当前日期时间是:2024-07-06T20:07:56.508+08:00[GMT+08:00]
当前时区是: GMT+08:00
本地日期是:2024-07-06T20:07:56.508+08:00[GMT+08:00]
本地时间是:20:07:56.508
  1. ZoneId:表示时区的标识符,可以通过它来获取具体的时区信息。
public class ZoneIdExample {public static void main(String[] args) {// 获取所有的可用时区IDSystem.out.println("所有可用的时区ID: " + ZoneId.getAvailableZoneIds());// 获取特定时区的信息ZoneId zoneId = ZoneId.of("Asia/Tokyo");System.out.println("时区ID为 Asia/Tokyo 的信息: " + zoneId);// 获取当前时区ZoneId currentZone = ZoneId.systemDefault();System.out.println("当前时区是: " + currentZone);}
}// 输出
所有可用的时区ID: [Asia/Aden, America/Cuiaba,……]
时区IDAsia/Tokyo 的信息: Asia/Tokyo
当前时区是: GMT+08:00

四、格式化

DateTimeFormatter 类用于格式化和解析日期时间对象,它提供了多种预定义的格式化方式,也支持自定义格式。

import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;public class DateTimeFormatterExample {public static void main(String[] args) {// 当前时间ZonedDateTime now = ZonedDateTime.now();System.out.println("当前时间是: " + now);System.out.println("另一种表示形式:" + now.format(DateTimeFormatter.RFC_1123_DATE_TIME));// 创建一个 DateTimeFormatter 对象并使用预定义格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化 LocalDateTime 对象String formattedDateTime = now.format(formatter);System.out.println("格式化后的日期时间: " + formattedDateTime);// 解析字符串到 LocalDateTime 对象LocalDateTime parsedDateTime = LocalDateTime.parse(formattedDateTime, formatter);System.out.println("解析后的日期时间: " + parsedDateTime);}
}

Java 8 提供了许多预定义的格式化模式

  • yyyy-MM-dd
  • yyyy-MM-dd HH:mm:ss
  • MMM dd, yyyy HH:mm:ss
  • 等等…

可以根据需要选择合适的格式化模式来格式化或解析日期时间字符串,使用自定义格式时要确保格式与输入字符串的格式匹配,否则会导致解析失败或异常 。

闲暇是霓裳,不宜常穿用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十一、作业

1.从大到小输出 写代码将三个整数数按从大到小输出。 void Swap(int* px, int* py) {int tmp *px;*px *py;*py tmp;} int main() {int a 0;int b 0;int c 0;scanf("%d %d %d", &a, &b, &c);int n 0;if (a<b){Swap(&a, &b);}if (a &l…

移动校园(2):express构建服务器,小程序调用接口,展示数据

express做服务器框架&#xff0c;mssql连接数据库&#xff0c;uni-request调用接口 这是文件夹目录 然后是index.js内容 const expressrequire(express) const appexpress() const uniRouterrequire("./uniRouter") const config{user:sa,password:123456,server:l…

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果&#xff0c;因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测&#xff1a;人脸关键点检测…

批导会计凭证程序报错,通过监控点和消息类来定位触发的位置

ZFIU001 批导会计凭证报错&#xff0c;通过监控点和消息类来定位触发的位置 在使用程序导入会计凭证的时候&#xff0c;发现报错&#xff0c;后面找了很久很久的系统标准程序&#xff0c;打断点才找到这个位置&#xff0c;使用监控点还是可以比较快速找到报错的原因的&#xff…

QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2

QWidget窗口抗锯齿圆角的一个实现方案&#xff08;支持子控件&#xff09;2 本方案使用了QGraphicsEffect&#xff0c;由于QGraphicsEffect对一些控件会有渲染问题&#xff0c;比如列表、表格等&#xff0c;所以暂时仅作为研究&#xff0c;优先其他方案 在之前的文章中&#…

昇思学习打卡-10-ShuffleNet图像分类

文章目录 网络介绍网络结构部分实现对应网络结构 模型训练shuffleNet的优缺点总结优点不足 网络介绍 ShuffleNet主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointwise G…

国内采用docker部署open-metadata

背景 最近看看开源的元数据管理项目&#xff0c;比较出名点的有open-metadata、datahub、OpenLineage、atlas。 open-metadata有1千多的贡献者&#xff0c;4.8K的stars&#xff0c;社区现在也比较活跃&#xff0c;支持的数据库类型还蛮多&#xff0c;基本市面上常见的都有支持…

【每日一练】python三目运算符的用法

""" 三目运算符与基础运算的对比 """ a 1 b 2#1.基础if运算判断写法&#xff1a; if a > b:print("基础判断输出&#xff1a;a大于b") else:print("基础判断输出&#xff1a; a不大于b")#2.三目运算法判断&#xff1a;…

揭秘IP:从虚拟地址到现实世界的精准定位

1.IP地址介绍 1.内网 IP 地址&#xff08;私有 IP 地址&#xff09; 内网 IP 地址&#xff0c;即私有 IP 地址&#xff0c;是在局域网&#xff08;LAN&#xff09;内部使用的 IP 地址。这些地址不会在公共互联网中路由&#xff0c;因此可以在多个局域网中重复使用。私有 IP 地…

股票Level-2行情是什么,应该怎么使用,从哪里获取数据

行情接入方法 level2行情websocket接入方法-CSDN博客 相比传统的股票行情&#xff0c;Level-2行情为投资者打开了更广阔的视野&#xff0c;不仅限于买一卖一的表面数据&#xff0c;而是深入到市场的核心&#xff0c;提供了十档乃至千档的行情信息&#xff08;沪市十档&#…

STM32第十六课:WiFi模块的配置及应用

文章目录 需求一、WiFi模块概要二、配置流程1.配置通信串口&#xff0c;引脚和中断2.AT指令3.发送逻辑编写 三、需求实现代码总结 需求 完成WiFi模块的配置,使其最终能和服务器相互发送消息。 一、WiFi模块概要 本次使用的WiFi模块为ESP-12F模块&#xff08;安信可&#xf…

【LLM第8篇】Delta Tuning

如何对large-scale PLM进行调整呢&#xff1f; 一个有效的方式是delta tuning&#xff1b;只更新PLM中的一小部分参数&#xff0c;其它参数不动。 把解决任务的能力具象化成delta object这样的参数&#xff0c;只需要几十兆参数存储。 过去模型参数是随机的&#xff0c;现在预…

【MySQL】逻辑架构与存储引擎

一、逻辑架构 1、MySQL逻辑架构 我们可以根据上图来对sql的执行过程进行分析 第一步&#xff1a;客户端与服务器建立一个连接&#xff0c;从连接池中分配一个线程处理SQL语句第二步&#xff1a;SQL接口接受SQL指令第三步&#xff1a;如果是5.7版本&#xff0c;就会先去缓存中…

Python字符串处理常用的30种操作

我们平时编写代码时&#xff0c;经常需要对字符串进行处理&#xff0c;本文详细介绍Python处理字符串常用的30种操作&#xff0c;并给出了对应的代码。 分割 使用split()方法将字符串按照指定的分隔符进行分割。 s "Hello,World" result s.split(","…

国产AI芯片被撕下遮羞布,宁买阉割八成性能的NVIDIA,也不买国产

曾经有传言指有国产AI芯片大受欢迎&#xff0c;还卖出了100万片&#xff0c;不过半年多时间过去&#xff0c;海外分析机构指出国内的互联网企业纷纷抢购NVIDIA阉割八成性能的H20&#xff0c;至于国产AI芯片则不获欢迎。 导致如此结果&#xff0c;在于NVIDIA拥有许多独特的优势&…

论文略读: LLaMA Pro: Progressive LLaMA with Block Expansion

ACL 2024 人类通常在不损害旧技能的情况下获得新技能 然而&#xff0c;对于大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如从LLaMA到CodeLLaMA&#xff0c;情况正好相反。深度学习笔记&#xff1a;灾难性遗忘-CSDN博客——>论文提出了一种用于LLMs的新的预训练…

Nettyの源码分析

本篇为Netty系列的最后一篇&#xff0c;按照惯例会简单介绍一些Netty相关核心源码。 1、Netty启动源码分析 代码就使用最初的Netty服务器案例&#xff0c;在bind这一行打上断点&#xff0c;观察启动的全过程&#xff1a; 由于某些方法的调用链过深&#xff0c;节约篇幅&#xf…

昇思MindSpore学习笔记4-03生成式--Diffusion扩散模型

摘要&#xff1a; 记录昇思MindSpore AI框架使用DDPM模型给图像数据正向逐步添加噪声&#xff0c;反向逐步去除噪声的工作原理和实际使用方法、步骤。 一、概念 1. 扩散模型Diffusion Models DDPM(denoising diffusion probabilistic model) &#xff08;无&#xff09;条件…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示BMP280传感器数据

LCD ST7735显示BMP280传感器数据 文章目录 LCD ST7735显示BMP280传感器数据1、硬件准备与接线2、代码实现本文介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 Bosch Sensortec 的 BMP280 气压和温度传感器连接。 NodeMCU 微控制器 (ESP8266EX) 从 BMP280 传感器读取温度和压力值,…