时间处理的未来: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,一经查实,立即删除!

相关文章

代码的坏味道——长参数

前言:一个函数的参数越少越好,并不是参数少或不传更优雅,而是有其他方案来优化长参数。一个函数的参数尽量不要超过3个,如果超过了这个限制,那么代码的坏味道就产生了。 一、整合参数 如果参数很多,那么第…

VueQuill 富文本编辑器技术文档快速上手

VueQuill 富文本编辑器技术文档 1. 安装 VueQuill2. 配置 VueQuill3. 在组件中使用 VueQuill4. 配置选项5. 事件处理6. 数据格式7. 自定义工具栏8. 示例项目结构9. 常见问题如何添加图片上传功能?如何自定义编辑器主题? 在此之前,我讲解过关于…

十一、作业

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…

vue2实现复制,粘贴功能,使用vue-clipboard2插件

一、需求说明 在项目中 点击按钮 复制 某行文本是很常见的 应用场景&#xff0c; 在 Vue 项目中实现 复制功能 需要借助 vue-clipboard2 插件。 二、代码实现 1、安装 vue-clipboard2 依赖 &#xff08; 出现错误的话&#xff0c;可以试试切换成淘宝镜像源 npm config set r…

基于YOLOv5的人脸目标检测

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

C++ STL容器:序列式容器-堆pirority_queue

摘要&#xff1a; CC STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;在C编程中的重要性不容忽视&#xff0c;STL提供了一系列容器、迭代器、算法和函数对象&#xff0c;这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …

[Python学习篇] Python文件操作

文件操作 打开文件 open 语法&#xff1a; file open(name, mode) 说明&#xff1a; file&#xff1a;文件对象。 name&#xff1a;要打开的目标文件名的字符串(可以包含文件所在的具体路径)。 mode&#xff1a;设置打开文件的模式(访问模式)&#xff1a;只读、写入、追加等…

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

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

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

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

C# LINQ 详细用法以及概念

LINQ&#xff08;Language Integrated Query&#xff09;是C#和.NET框架中的一个强大功能&#xff0c;它允许开发者使用查询语法来访问和操作数据集合。LINQ提供了一种一致且直观的方式来处理不同类型的数据源&#xff0c;如集合、XML文档、数据库等。本文将详细讲解LINQ的各种…

计算机网络-第4章 网络层

4.1网络层的几个重要概念 4.1.1网络层提供的两种服务 电信网面向连接通信方式&#xff0c;虚电路VC。 互联网设计思路&#xff1a;网络层要设计得尽量简单&#xff0c;向其上层只提供简单灵活的&#xff0c;尽最大努力交付的数据报服务。 网络层不提供服务质量的承诺&#…

使用 Spring 配置邮件服务器

在现代的企业应用开发中&#xff0c;邮件发送是一个常见的需求。Spring 提供了强大的邮件支持&#xff0c;使得配置和发送邮件变得非常简单。本文将介绍如何在 Spring 应用中配置邮件服务器并发送电子邮件。 1. 引入 Spring 邮件依赖 首先&#xff0c;在项目的 pom.xml 文件中…

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

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

Activity启动模式探究

一、概括 Activity的启动模式主要分为四种&#xff1a;standard&#xff08;标准模式&#xff09;、singleTop&#xff08;栈顶复用模式&#xff09;、singleTask&#xff08;栈内复用模式&#xff09;和singleInstance&#xff08;单例模式&#xff09;。每种模式都有其特定的…

日常学习--20240705

1、IO流 按照IO操作的数据类型分为字节流和字符流&#xff1a; 字节流&#xff1a;又分为输入流&#xff08;其他程序传递过来的数据&#xff0c;读取流中的数据&#xff09;和输出流&#xff08;往流中写数据&#xff0c;传递给其他程序&#xff09;;可以操作二进制文件&…

国内采用docker部署open-metadata

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

使用Python连接本地MySQL数据库并创建表后添加数据

一、使用Python连接本地MySQL数据库并创建表后添加数据 端口号&#xff1a;3307 用户名&#xff1a;root 密码&#xff1a;lms123456 数据库&#xff1a;test_01 from orm import *# 数据库连接对象 db MySQLDatabase(host"localhost",port3307,user"root…

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

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