时间处理的未来: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.rhkb.cn/news/371042.html

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

相关文章

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…

数字化精益生产系统--QMS质量管理系统

QMS质量管理系统(Quality Management System)是现代企业管理的关键组成部分,旨在确保产品和服务的质量达到或超过客户需求和期望。 以下是对QMS质量管理系统的功能设计:

MAX98357、MAX98357A、MAX98357B小巧、低成本、PCM D类IIS放大器,具有AB类性能中文说明规格书

前言: MAX98357A支持标准I2S数据,MAX98357B支持左对齐数字音频数据。两个版本均支持8通道TDM音频数据。 IIS数字功放MAX98357开发板/评估系统 MAX98357 WLP-9(1.347x1.437mm)封装的外观和丝印AKM MAX98357 TQFN-16-EP(3x3mm)封装的外观和丝印AKK 引脚说…

基于PHP技术的在线校园美食攻略程序设计与实现

基于PHP技术的在线校园美食攻略程序设计与实现 摘 要 网络技术正在以空前持续的速度在改变着我们的生活。利用互联网技术,人们对网上食物共享越来越关注。基于此,本文利用 PHP技术,对网上大学饮食指南应用软件进行了研究。 整个系统的设计&a…

目标检测算法简述

招聘信息共享社群https://bbs.csdn.net/forums/f6512aad40c7444c8252754ce2dbb427 目标检测算法是一种计算机视觉技术,用于识别图像或视频中的特定对象,并确定这些对象在场景中的精确位置。这些算法通常结合了分类和定位的功能,能够输出每个…

从0构建一款appium-inspector工具

上一篇博客从源码层面解释了appium-inspector工具实现原理,这篇博客将介绍如何从0构建一款简单的类似appium-inspector的工具。如果要实现一款类似appium-inspector的demo工具,大致需要完成如下六个模块内容 启动 Appium 服务器连接到移动设备或模拟器启…

leetcode每日一题-3101 交替子数组计数

暴力遍历&#xff1a;看起来像是回溯,实际上就是递归 class Solution { private:long long _res 0; public:long long countAlternatingSubarrays(vector<int>& nums) {backtrack(nums, 0);return _res;}void backtrack(vector<int>& nums, long long st…

零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频

文章目录 一.概要二.PWM输入框架图三.CubeMX配置一个PWM输入例程1.硬件准备2.创建工程3.调试 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是利用单…

最短路算法——差分约束

差分约束 (1) 求不等式组的可行解 源点&#xff1a;从源点出发&#xff0c;一定可以走到所有的边求可行解步骤&#xff1a; 先将每个不等式 x i ≤ x j c x_i \le x_j c xi​≤xj​c,转化成一条从 s j s_j sj​走到 s i s_i si​&#xff0c;长度为 c k c_k ck​ 的一条边找…

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展&#xff0c;笔者在学习这些内容时&#xff0c;特地整理记录下来&#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类&#xff0c;Integer和int区别是什么&#xff1f; 使用封装类的目的 对象化:…

C++ 引用——常量引用

作用&#xff1a;常量引用主要用来修饰形参&#xff0c;防止误操作 在函数形参列表中&#xff0c;可以加const修饰形参&#xff0c;防止形参改变实参 示例&#xff1a; 运行结果&#xff1a;

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

ARMv8寄存器详解

文章目录 一、ARMv8寄存器介绍二、通用寄存器三、 PSTAE寄存器四、特殊寄存器五、系统寄存器 一、ARMv8寄存器介绍 本文我来给大家介绍一下ARMv8的寄存器部分&#xff0c;ARMv8中有34个寄存器&#xff0c;包括31个通用寄存器、一个栈指针寄存器SP(X31),一个程序计数器寄存器PC…

Git中两个开发分支merge的原理

一 分支合并 1.1 原理 分支合并&#xff1a;就是将A分支修改后且commit的内容&#xff0c;合并到B分支&#xff0c;这些修改且提交的内容和B分支对应的内容和位置进行比较&#xff1a; 1.不一样的话&#xff0c;提示冲突&#xff0c;需要人工干预。 2.一样的话&#xff0c;…

LLM - 卷积神经网络(CNN)

1. 卷积神经网络结构&#xff1a;分为输入层&#xff0c;卷积层&#xff0c;池化层&#xff0c;全连接层&#xff1b; &#xff08;1&#xff09;首先进入输入层&#xff0c;对数据数据进行处理&#xff0c;将输入数据向量化处理&#xff0c;最终形成输入矩阵。 &#xff08;…

vue3使用方式汇总

1、引入iconfont阿里图库图标&#xff1a; 1.1 进入阿里图标网站&#xff1a; iconfont阿里&#xff1a;https://www.iconfont.cn/ 1.2 添加图标&#xff1a; 1.3 下载代码&#xff1a; 1.4 在vue3中配置代码&#xff1a; 将其代码复制到src/assets/fonts/目录下&#xff1…

Overleaf :LaTeX协作神器!【送源码】

Overleaf 是一个广受欢迎的在线 LaTeX 编辑器&#xff0c;专为学术写作和文档排版设计。它以其协作功能和用户友好的界面而闻名&#xff0c;使得 LaTeX 编辑变得更加容易和直观。 软件介绍 Overleaf 提供了一个基于云的 LaTeX 编辑环境&#xff0c;支持实时协作&#xff0c;使得…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

Blazor SPA 的本质是什么以及服务器端渲染如何与 Blazor 的新 Web 应用程序配合使用

Blazor 通常被称为单页应用程序 (SPA) 框架。当我第一次开始使用 Blazor 时&#xff0c;我对 SPA 的含义、组件如何为 SPA 架构做出贡献以及所有这些如何与交互性联系在一起感到困惑。 今天&#xff0c;我将解答大家可能关心的三个问题&#xff1a; 什么是 SPA&#xff1f;了…

STM32 Cannot access memory

问题描述 最近自己做了一块STM32F103ZET6的板子&#xff0c;在焊接完成后可以在下载器界面看到idcode&#xff0c;但烧录时报错 Cannot access memory 。 解决办法 测量STM32各个供电项&#xff0c;发现时33脚处VDDA电压只有1.8V&#xff0c;是因为R3电阻过大&#xff0c;…