深入了解Java 8日期时间新玩法:DateTimeFormatter与ZoneOffset的使用

news2024/11/28 4:30:51

 

推荐语

在这篇文章中,我们将深入探讨Java中的DateTimeFormatter和ZoneOffset类的功能和使用方法。这些类是在Java 8中引入的新的日期时间API的一部分,它们为我们提供了更灵活、更易用的日期和时间处理能力。尽管这些类在Java 8中已经出现,但是对许多开发人员来说,它们可能仍然相对陌生。因此,本文旨在帮助读者更好地理解这些类的基本概念、核心方法和实际应用场景。

通过本文的介绍,您将了解如何使用DateTimeFormatter和ZoneOffset类来处理日期时间,以及如何在实际开发中应用它们。尽管本文是一些相对较基础的内容,但我们希望通过分享这些知识,能够激发您对Java日期时间处理的兴趣和热情。

如果您对Java日期时间处理有更深入的需求或问题,我们鼓励您在评论区留言,让我们一起探讨和学习。当然,如果方便话,麻烦小伙伴能够把免费的点赞、收藏,走上一波!创作不易,感谢支持!

注意

本文编写的单元测试是基于java11,具体的版本号是:11.0.19

DateTimeFormatter

DateTimeFormatter是Java 8中引入的一个日期时间格式化工具,用于打印和解析日期时间对象。它使用用户定义的格式(如"yyyy-MMM-dd hh:mm:ss")或使用预定义的常数(如ISO_LOCAL_DATE_TIME)来格式化日期时间。DateTimeFormatter是不可变的,并且是线程安全的,这使得它可以在多线程环境下安全使用。和SimpleDateFormat不同的是,DateTimeFormatter不但是不变对象,它还是线程安全的,因为SimpleDateFormat不是线程安全的,使用的时候,只能在方法内部创建新的局部变量。而DateTimeFormatter可以只创建一个实例,到处引用。

核心方法

  • DateTimeFormatter.ofPattern(String pattern): 根据指定的格式化字符串创建DateTimeFormatter实例。
  • DateTimeFormatter.format(LocalDateTime dateTime): 将给定的LocalDateTime对象格式化为指定的格式。
  • DateTimeFormatter.format(ZonedDateTime dateTime): 将给定的ZonedDateTime对象格式化为指定的格式。
  • DateTimeFormatter.format(OffsetDateTime dateTime): 将给定的OffsetDateTime对象格式化为指定的格式。
@Test
public void test() {
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    dateTimeFormatter.format(LocalDateTime.now());
    dateTimeFormatter.format(ZonedDateTime.now());
    dateTimeFormatter.format(OffsetDateTime.now(ZoneId.systemDefault()));
}

使用场景

日期和时间的格式化与解析:DateTimeFormatter主要用于将日期和时间对象格式化为字符串,或者将字符串解析为日期和时间对象。这在日志记录、数据传输和存储等场景中非常常见。例如,你可以将一个LocalDateTime对象格式化为"yyyy-MM-dd HH:mm:ss"格式的字符串,或者将一个字符串解析为LocalDateTime对象。

ZoneOffset

在Java8中,ZoneOffset类表示的是一种时间偏移量,可以简单理解为从一个基准时间(通常是UTC)到特定时区的偏移量。它包含了一些属性和方法,使用ZoneOffset可以方便地将一个时间从一个时区转换为另一个时区。例如,如果你有一个在UTC的时间,你可以使用ZoneOffset来将其转换为其他时区的时间。同样,如果你有一个在其他时区的时间,你可以使用ZoneOffset来将其转换为UTC时间。

UTC时间是指协调世界时(Coordinated Universal Time),也称为世界标准时间。它是全球统一使用的时间标准,用于协调跨越不同时区的时间。UTC通常以24小时制表示,格式为hh:mm:ss,表示小时、分钟和秒数。UTC时间不受夏令时的影响,保持恒定,而且被广泛用于全球各个领域,如航空、天文学、计算机网络等,以确保时间的一致性。

核心方法

  • ZoneOffset.of(String):这个方法接受一个表示偏移量的字符串,比如"+08:00"或"-05:30"。该方法会解析字符串并创建一个对应的ZoneOffset对象。
  • ZoneOffset.ofHours(int):这个方法接受一个表示小时数的整数,然后返回一个偏移量为此小时数的ZoneOffset对象。例如,调用ZoneOffset.ofHours(8)将返回一个表示偏移量为+08:00的ZoneOffset对象。
  • ZoneOffset.ofHoursMinutes(int, int):这个方法接受两个整数,分别表示小时数和分钟数。然后返回一个偏移量为此小时和分钟数的ZoneOffset对象。例如,调用ZoneOffset.ofHoursMinutes(8, 30)将返回一个表示偏移量为+08:30的ZoneOffset对象。
  • ZoneOffset.ofHoursMinutesSeconds(int, int, int):这个方法接受三个整数,分别表示小时数、分钟数和秒数。然后返回一个偏移量为此小时、分钟和秒数的ZoneOffset对象。例如,调用ZoneOffset.ofHoursMinutesSeconds(8, 30, 45)将返回一个表示偏移量为+08:30:45的ZoneOffset对象。
@Test
public void test2() {
    //第一种用法示例:
    // 使用"Z"创建一个表示UTC的ZoneOffset对象,即格林尼治时间
    ZoneOffset utc = ZoneOffset.of("Z");
    System.out.println("UTC: " + utc);
    ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 12, 7, 13, 23, 32, 0, ZoneId.systemDefault());
    System.out.println(zonedDateTime);//当前日期时间:2023-12-07T13:23:32+08:00[Asia/Shanghai]
    ZonedDateTime with = zonedDateTime.withZoneSameInstant(utc);//当前时间,在同一时刻的格林泥治时间
    System.out.println(with);//输出结果:2023-12-07T05:23:32Z,当前本地是北京时间,即东八区时间,与位于零时区的格林泥治时间相差是8小时;
    //第二种用法示例:
    // 使用"+"和"-"符号创建一个表示偏移量的ZoneOffset对象
    ZoneOffset offset = ZoneOffset.of("+08:00"); // 表示比UTC时间超前八个小时
    System.out.println("Offset: " + offset);
    ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2023, 12, 7, 13, 23, 32, 0, ZoneId.systemDefault());
    System.out.println(zonedDateTime2);//当前日期时间:2023-12-07T13:23:32+08:00[Asia/Shanghai]
    ZonedDateTime with2 = zonedDateTime2.withZoneSameInstant(offset);//当前时间,在同一时刻的格林泥治时间
    System.out.println(with);//输出结果:2023-12-07T05:23:32Z,当前本地是北京时间,即东八区时间,与位于零时区的格林泥治时间相差是8小时;
}

使用场景

ZoneOffset的使用场景通常是在需要将时间从一个时区转换为另一个时区的情况下。例如,假设你有一个服务器,它需要同时处理来自不同时区的用户请求,那么你就可以使用ZoneOffset来进行时区的转换。

以下是一个使用ZoneOffset的示例:

假设你正在开发一个电子商务网站,用户可以注册并选择自己的时区。当用户浏览网站上的商品或查看订单时,你希望根据用户选择的时区来显示正确的时间。为了实现这个功能,你可以使用ZoneOffset将服务器的时间(通常是UTC时间)转换为用户的时区时间。

具体实现可以如下:

  • 当用户注册时,让他们选择一个时区。你可以使用ZoneOffset类来提供一些预设的时区选项,或者让用户自行输入他们的时区偏移量。
  • 当用户浏览网站上的商品或查看订单时,你可以使用ZoneOffset将服务器的时间转换为用户的时区时间。例如,你可以使用ZoneOffset.ofHoursMinutes(-5, 0)来将UTC时间转换为美国东部时间的时区偏移量。
  • 将转换后的时间显示在网页上,以便用户可以按照他们选择的时区来查看商品或订单的正确时间。

这个示例展示了如何使用ZoneOffset将服务器的时间转换为用户的时区时间,以便提供更准确和个性化的用户体验。通过使用ZoneOffset,你可以轻松地在不同时区之间进行转换,并确保用户能够按照他们选择的时区来查看和操作数据。

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

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

相关文章

SIT3232E高静电防护,单电源供电,双通道,RS232 收发器

SIT3232E 是一款 3.0V~5.5V 供电、双通道、低功耗、高静电防护 ESD 保护,完全满足 TIA/EIA-232 标准要求的 RS-232 收发器。 SIT3232E 包括两个驱动器和两个接收器,具有增强形 ESD 保护功能,达到 15kV 以上 HBM ESD 、 8kV …

拼多多商品详情数据接口在数据分析行业的作用性

在数据分析行业中,拼多多商品详情数据的作用性主要体现在以下几个方面: 了解市场和用户需求:通过拼多多商品详情数据,企业可以了解到市场上什么产品受欢迎,用户对产品的反馈和评价如何,从而调整自己的销售…

Qt/QML编程学习之心得:工程中的文件(十二)

Qt生成了工程之后,尤其在QtCreator产生对应的project项目之后,就如同VisualStudio一样,会产生相关的工程文件,那么这些工程文件都是做什么的呢?这里介绍一下。比如产生了一个Qt Widget application,当然如果Qt Quick Application工程会有所不同。 一、.pro和.pro.user …

神经内科临床常用的焦虑、抑郁评估量表,医生必备!

根据神经内科医生的量表使用情况,常笑医学整理了神经内科临床上常用的焦虑、抑郁评估量表,为大家分享临床常见的焦虑、抑郁、睡眠等量表评估内容,均支持量表下载和在线使用,建议收藏! 1.汉密顿抑郁量表(Ham…

初识Linux:权限(1)

目录 提示:以下指令均在Xshell 7 中进行 Linux 的权限 内核: 查看操作系统版本 查看cpu信息 查看内存信息 外部程序: 用户: 普通用户变为超级用户: su 和 su-的区别: root用户变成普通用户&#…

一文搞懂全连接算法和它的作用

如果你是搞AI算法的同学,相信你在很多地方都见过全连接层。 无论是处理图片的卷积神经网络(CNN),还是处理文本的自然语言处理(NLP)网络,在网络的结尾做分类的时候,总是会出现一个全…

chfs,简单好用的局域网共享网盘

1. 网盘简介 2. 下载安装包 点击地址下载 3. 部署网盘 (1)创建文件夹 mkdir -p /opt/chfs/share /opt/chfs/logs share 共享文件夹,也就是存放文件的地方 logs 存放日志文件(2)上传压缩包到 /opt/chfs目录下…

3dMax vs Cinema4d哪个更好更适合你?

Cinema 4d和3dMax的区别 用于游戏风格、开发和风格可视化的3D建模、动画和渲染软件系统,为用户提供制作和编辑动画、视觉效果和环境的灵活性。4D CINEMA可能是由MAXON构建的强大的3D建模、运动图形、绘画和动画软件系统。Cinema 4D将在每个Windows和MAC操作系统上运…

【UE5】监控摄像头效果(上)

目录 效果 步骤 一、视角切换 二、摄像头画面后期处理 三、在场景中显示摄像头画面 效果 步骤 一、视角切换 1. 新建一个Basic关卡,添加第三人称游戏资源到项目浏览器 2. 新建一个Actor蓝图,这里命名为“BP_SecurityCamera” 打开“BP_Securit…

Hugging Face 给普通用户提供了一个 2 vCPU 16GB 的免费空间

Hugging Face 给普通用户提供了一个 2 vCPU 16GB 的免费空间,并且支持部署 Gradio 构建的应用程序,非常方便,下面我们进入 https://huggingface.co/spaces/ ,点击创建空间。

每天五分钟计算机视觉:稠密连接网络(DenseNet)

本文重点 在前面的课程中我们学习了残差网络ResNet,而DenseNet可以看成是ResNet的后续,我们看一下图就可以看出二者的主要区别了。 特点 DenseNet是一种卷积神经网络,它的特点是每一层都直接连接到所有后续层。这意味着,每一层都接收来自前一层的输出,并将其作为输入传递…

【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误

目录 1 Error错误提示 2 Error错误原因 3 如何消除Error错误 结尾 【S32K3_MCAL从入门到精通】合集: S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error错误提示 使用S32DSJ-LinK下载程序,在Dedug Configurati…

python数据分析之二、读取excel数据并绘制折线图,柱状图、饼状图

今天开始第二篇,也是那位可爱的同学的期末作业 题目基本描述如下:给一个简单的execl表格数据,用并列折线图,并列柱状图和饼图来表现数据。 现给定表格数据如下: 地区人口数0-14岁5-64岁65岁及以上全国14940542613671…

LeetCode Hot100 17.电话号码的字母组合

题目: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 方法:灵神 子集型回溯 class Solution {p…

Web前端监控的方案

Web前端监控的方案 前端监控是一个非常重要的话题,对于业务的发展意义重大,就像遍布在城市各处的探头,实时监测整座城市的运行状况,保证系统的稳定、高效运行。 前端监控的意义 前端监控,对于业务和团队的重要性&am…

如何进行代码混淆?方法与常见工具介绍

​ 如何进行代码混淆?方法与常见工具介绍 目录 什么是代码混淆? 代码混淆的方法 常见代码混淆工具 什么是代码混淆? 代码混淆是指将计算机程序的代码转换成一种功能上等价,但难于阅读和理解的形式的行为。混淆后的代码很难被…

设备温度和振动综合监测:温振一体式传感器的优点和应用

随着工业设备的复杂性和自动化程度的提高,对设备状态监测的需求也日益增加。温振一体式传感器作为一种集振动和温度监测于一体的传感器,具备多项优势,因此在工业设备状态监测领域得到广泛应用。 温振一体式传感器基于振动传感器和温度传感器的…

智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.参考…

Ubuntu22.04安装完成后便可直接使用键盘上的Print键进行截图

概要:Ubuntu22.04安装完成后,无需安装什么截图软件,可以直接使用键盘上的Print键进行截图。 1、按一下Print键 我的电脑上Print键是PrtSc,如下图所示 2、框选区域并截图 如下图中,可以框选(Selection),也…

HbuilderX使用Uniapp+Vue3安装uview-plus

如果你是vue2版本想使用uniapp去配置uviewui库可以参考之前的文章 小程序的第三方ui库推荐较多的还是uview的,看起来比较美观,功能也比较完善,下面将提一下Vue3安装uview-plus库的教程 创建项目 安装 首先进入官网 uView-Plus 直接下载并导…