zoneId、ZoneOffset、Date、LocalDateTime、ZonedDateTime、OffsetDateTime的区别

1、zoneId
2、ZoneOffset继承了zoneId

3、ZoneOffset 和 TimeZone区别

ZoneOffset 和 TimeZone 是 Java 编程语言中处理时区信息的两个不同的类。

ZoneOffset 类:

ZoneOffset 是 Java 8 中引入的日期时间 API 的一部分,位于 java.time 包中。
它代表了与协调世界时(UTC)之间的固定时间偏移,以固定的小时和分钟表示。
例如,+02:00 表示时间比协调世界时快 2 小时。
TimeZone 类:

TimeZone 是旧的日期时间 API 中的类,位于 java.util 包中。
它用于表示时区信息,包括时区偏移、夏令时规则等。
TimeZone 类在 Java 1.0 中引入,但在 Java 8 之后,新的日期时间 API 提供了更先进和更安全的替代方案。
关系:

ZoneOffset 和 TimeZone 都与时区有关,但它们表示时区信息的方式不同。

ZoneOffset 表示一个固定的时区偏移,而 TimeZone 表示一个完整的时区,包括可能的夏令时规则。
在新的日期时间 API 中,更推荐使用 ZoneOffset 或 ZoneId(ZoneId 是 ZoneOffset 的父接口,也可以表示命名的时区,比如 “Europe/Paris”)。
如果你必须与旧的代码或库一起工作,可能需要进行一些转换,可以使用 ZoneId.of(“ZoneOffset”) 将 ZoneOffset 转换为 ZoneId。反之亦然。

ZoneOffset是JAVA8的API,他也包含了当地时间和UTC的偏移量。

TimeZone 这个是旧的,它包含了时区信息,偏移量等。


Date 和 LocalDateTime 是 Java 编程语言中处理日期和时间的两个不同的类。

Date 类:

Date 类是 Java 中用于表示日期和时间的类,它在 Java 1.0 中引入,但在 Java 8 之后已被大部分新的日期时间 API 所取代。
Date 类封装了自1970年1月1日UTC(协调世界时)开始的毫秒数。
这个类有一些问题,比如它是可变的,而且存在时区问题,因此在新的应用中更常用其他日期时间类。
LocalDateTime 类:

LocalDateTime 是 Java 8 中引入的日期时间 API 的一部分,位于 java.time 包中。
LocalDateTime 表示不带时区的日期和时间,即它不考虑时差或夏令时等问题。
该类提供了更丰富的日期和时间操作方法,同时是不可变的,因此更适合在多线程环境中使用。
关系:

Date 类和 LocalDateTime 类都用于表示日期和时间,但它们分别属于不同的日期时间 API。
在使用新的日期时间 API 时,推荐使用 LocalDateTime,因为它提供更强大和更安全的操作,并且考虑了一些 Date 类的问题。
如果你必须与旧的代码或库一起工作,可能需要在它们之间进行转换。可以使用 Date 类的 toInstant() 方法将其转换为 Instant,然后再通过 Instant 转换为 LocalDateTime。反之亦然。

小结:Date的老的日期API,LocalDateTime是JDK8的AIP, Date包含了时间戳,并且是UTC+时区的时间。

LocalDateTime 表示不带时区的日期和时间,所以他不用考虑时区带来的问题。

一、ZoneId and Offset

  1. ZoneId 表示时区,比如上海,北京、京东等等,当然既然知道时区,自然也就知道偏移量。
  2. ZoneOffset 表示偏移量,就是格林威治/ UTC时间的时区偏移量。这里不包含时区,因为同一个偏移量,可能会有多个时区,比如北京和上海的市区偏移量是一样的,但是他们属于不同的时区

ZoneId.getAvailableZoneIds(); 这个可以获取所有时区

ZoneId and Offset要配合时间类来使用,常用的时间类有下面3种

  • ZonedDateTime 使用格林威治/ UTC 的时区偏移量处理具有相应时区的日期和时间。
  • OffsetDateTime 使用格林威治/ UTC 的相应时区偏移量处理日期和时间,但不包含时区 ID。
  • OffsetTime 使用格林威治/ UTC 的相应时区偏移量处理时间,但不包含时区 ID。

二、ZonedDateTime

ZonedDateTime是结合了LocalDateTime类与zoneId类

前面介绍了LocalDateTime是不包含偏移量,也不好时区,就是一个时间,所以LocalDateTime可以很好的和zoneId或者ZoneOffset类一起使用

下面代码通过LocalDateTime+ZoneId得到ZonedDateTime

LocalDateTime leaving = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
ZoneId leavingZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime departure = ZonedDateTime.of(leaving, leavingZone);
System.out.println(departure);
//ZonedDateTime结合DateTimeFormatter,可以转成我们想要的时间字符串格式,//通过给ZonedDateTime设置新的时区,会刷新ZonedDateTime时间,返回该时区对应的时间。
ZoneId arrivingZone = ZoneId.of("Asia/Tokyo");
ZonedDateTime zonedDateTime = departure.withZoneSameInstant(arrivingZone);
System.out.println(zonedDateTime);

总结下:

1、首先固定一个不带任何时区的时间,也就是LocalDateTime
2、把这个时间加上需要的时区,就标识这个时间就是该时区的
3、把带时区的时间转换成目标时区,就可以得到一个目标时区的时间。

案例:组装一个地区+时间,比如洛杉矶时间,并且把他转成东京时间。这个是通过设置新的时区,来刷新时间。

DateTimeFormatter format = DateTimeFormatter.ofPattern("YYYY-MM-dd  HH:mm:ss");//例如:2013-07-20 19:30:00
LocalDateTime leaving = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
ZoneId leavingZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime departure = ZonedDateTime.of(leaving, leavingZone);
String out1 = departure.format(format);
System.out.printf("LEAVING:  %s (%s)%n", out1, leavingZone);//补充知识:东京比洛杉矶多17个小时左右,比如洛杉矶上午4:50 在东京就是21:50
ZoneId arrivingZone = ZoneId.of("Asia/Tokyo");
//使用美国洛杉矶出发的时间,然后换算成东京的时区,返回该时区对应的时间
ZonedDateTime arrival = departure.withZoneSameInstant(arrivingZone);//时间转成字符串
String out2 = arrival.format(format);
System.out.printf("ARRIVING: %s (%s)%n", out2, arrivingZone);

案例2:改变时区和刷新时间

LocalDateTime date = LocalDateTime.of(2018, 05, 01, 0, 0, 0);
ZonedDateTime d1 = ZonedDateTime.of(date, ZoneId.systemDefault());// 把该时间转换成指定时区了,也就是会刷新这个地区的时间。
d1.withZoneSameInstant(ZoneId.of("Asia/Yerevan"));// 只是改变了时区,不刷新时间
d1.withZoneSameLocal(ZoneId.of("Asia/Yerevan"));

二、OffsetDateTime

OffsetDateTime结合了 LocalDateTime 与类 ZoneOffset 类。它用于表示格林威治/ UTC 时间的偏移量,注意这个是不带时区的,相同的偏移量,可能会存在多个时区。

使用场景:比如有一个国外的时间,并且知道偏移量,那么我们要把这个时间转成标准的UTC+0的时间,或者转成北京时间。就可以使用下面的方式。

//1、通过其他地区的时间+偏移量 来得到对应的国际标准时间。// 2017.07.20 19:30:00
LocalDateTime localDate = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
ZoneOffset offset = ZoneOffset.of("-08:00");
//通过LocalDateTime+ZoneOffset来得到OffsetDateTime
OffsetDateTime offsetDate = OffsetDateTime.of(localDate, offset);//通过OffsetDateTime,我们可以重试给他设置偏移量,类得到这个偏移量所对应的时间。
OffsetDateTime offsetDateTime = offsetDate.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println(offsetDateTime);//2、OffsetDateTime也是可以转成Date的,不过需要理解下面的内容
//通过offsetDateTime转成LocalDateTime,在通过LocalDateTime转成Date,这里需要注意,首先是OffsetDateTime得到的LocalDateTime就是这个偏移所对应的时间,
// 时间上是没有任何变化,只是转成LocalDateTime对象
//LocalDateTime,是日期+偏移量,但是没有时区,atZone就是给他设置时区,这个时区,代码是取了默认的ZoneId.systemDefault(),所以最终结果date是没有任何变化,
// 只是加了时区进去,但是不会因为时区不同,导致时间变化。只有重行设置偏移量才会变化。
//OffsetDateTime offsetDateTime = offsetDate.withOffsetSameInstant(ZoneOffset.UTC);
//Date.from(offsetDateTime.toLocalDateTime().atZone(ZoneId.systemDefault()).toInstant());//3、设置新的偏移量,但是不刷新时间//设置新的偏移量,但是不会刷新时间,那么偏移量怎么得到呢?直接使用ZoneOffset.of方法
ZoneOffset newZoneOffset= ZoneOffset.of("-08:00");
OffsetDateTime offsetDateTime1=offsetDateTime.withOffsetSameLocal(newZoneOffset);
System.out.println(offsetDateTime1);//4、设置新的偏移量,刷新时间。ZoneOffset newZoneOffset1= ZoneOffset.of("-08:00");
OffsetDateTime offsetDateTime2 = offsetDate.withOffsetSameInstant(newZoneOffset1);
System.out.println(offsetDateTime2);
//注意withOffsetSameInstant和withOffsetSameLocal的作用是不一样的,withOffsetSameLocal是设置单纯的设置偏移量,不刷新时间。

三、OffsetTime

OffsetTime实际上,结合 LocalDateTime 与类 ZoneOffset 类。和OffsetDateTime比较像。所以我们大部分都是使用OffsetDateTime。

原文跳转1

原文跳转2

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

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

相关文章

Unity之第一人称角色控制

目录 第一人称角色控制 😴1、准备工作 📺2、鼠标控制摄像机视角 🎮3、角色控制 😃4.杂谈 第一人称角色控制 专栏Unity之动画和角色控制-CSDN博客的这一篇也有讲到角色控制器,是第三人称视角的,以小编…

使用最大边界相关算法处理文章自动摘要

一、需求背景 对于博客或者文章来说,摘要是普遍性的需求。但是我们不可能让作者自己手动填写摘要或者直接暴力截取文章的部分段落作为摘要,这样既不符合逻辑又不具有代表性,那么,是否有相关的算法或者数学理论能够完成这个需求呢&…

【C++】默认成员函数

与普通成员函数差距较大,形式对于我们比较陌生,但这是语法,是我们是必须要掌握的。 目录 类的默认成员函数:构造函数:概念:语法:特性: 析构函数:概念:语法&a…

解决:ModuleNotFoundError: No module named ‘torchvision’

解决:ModuleNotFoundError: No module named ‘torchvision’ 文章目录 解决:ModuleNotFoundError: No module named torchvision背景报错问题报错翻译报错位置代码报错原因解决方法方法一,直接安装方法二,手动下载安装方法三&…

jdk17新特性—— 密封类(Sealed Classes)

目录 一、密封类(Sealed Classes)的概述1.1、概述1.2、特性1.3、注意事项 二、密封类(Sealed Classes)代码示例2.1、密封类(Sealed Classes)代码结构示例2.2、密封类(Sealed Classes)代码示例 三、密封类(Sealed Classes)接口代码示例3.1、密封类(Sealed Classes)接口代码结构示…

go语言标准库flag命令行参数解析

Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。 os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。 package mainimport ("fmt""os" )//os.Ar…

微信小程序~上推加载更多组件

本组件使用的是TaroReact 实现的 ,具体代码如下 一共分为tsx和less文件 //index.tsx /** RefreshLoading* description 上推加载更多组件* param loading boolean* param style* returns*/import { View } from "tarojs/components"; import React, { FC…

springboot(ssm爱心商城系统 爱心捐赠商城系统Java系统

springboot(ssm同城上门喂遛宠物系统 宠物预约系统Java系统 开发语言:Java 框架:springboot(可改ssm) vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7&a…

2023蓝帽初赛

APK取证 1.涉案apk的包名是?[答题格式:com.baid.ccs] 用雷电APP智能分析打开 在基本信息里得到应用包名 答案:com.vestas.app 2.涉案apk的签名序列号是?[答题格式:0x93829bd] 同理,在详细信息里面找到了签名序列号 答案&…

nodejs+vue+mysql校园失物招领网站38tp1

本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户和管理员这两者的需求。操作简单易懂,合理分析各个模块的功能,尽可能优化界…

立体边界,让arcgis出图更酷炫一些

就是这样子的那个图—— 本期我们还是用长沙市为例, 来手把手的演示制作立体边界, 就是这个样子的边界—— 第一步—准备底图 其实你准备什么底图都可以哈,例如调用天地图、下载个影像图,或者用其他什么的底图,都是…

在ubuntu22.04中借助docker实现安装、调试ros1.0

一.安装docker 参考:https://www.cnblogs.com/cqpanda/p/16247919.html 使用安装方法1直接安装,没出问题,我就继续了。出问题按方法2安装吧。 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 二.docker中安装ros1.…

基于微信小程序+Springboot线上租房平台设计和实现【三端实现小程序+WEB响应式用户前端+后端管理】

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

MATLAB矩阵的操作(第一部分)

矩阵的基本知识 矩阵概念 矩阵(Matrix)在数学中是一个由复数或实数组成的矩形阵列,其元素按照行和列排列。矩阵的定义可以形式化地描述为: 一个 m 行 n 列的矩阵是一个有序的数表,其中包含 m*n 个数,可以…

HG/T 3830-2022 预涂卷材涂料检测

预涂卷材涂料是指以树脂为主要成膜物质,并加入固化剂、颜料、体质颜料、助剂等配置而成,且以连续涂装方式涂覆在金属薄板上的溶剂型涂料、水性涂料或粉末涂料。 HG/T 3830-2022溶剂型和水性预涂卷材涂料检测项目: 测试指标 测试方法 在容器…

【乳腺肿瘤诊断分类及预测】基于PNN概率神经网络

课题名称:基于PNN的乳腺肿瘤诊断分类及预测 版本日期:2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院经过多年的收集和整理,建…

Java希尔排序

希尔排序是一种改进的插入排序算法,也称为缩小增量排序。它通过将待排序的数组按照一定的间隔分割成若干个子序列,然后对这些子序列进行插入排序,随着排序进行,逐渐减小间隔,直至间隔为1,最后对整个数组进行…

Selenium处理Alert弹窗

页面弹窗有 3 种类型: alert(警告信息) confirm(确认信息) prompt(提示输入) 对于页面出现的 alert 弹窗,Selenium 提供如下方法: 序号 方法/属性 描述 1 ac…

如何更改Outlook阅读邮件时的默认字体?

如果收到的邮件中未指定字体,outlook默认使用宋体显示。 如果觉得不好看,可以进行更改。但不是在outlook中更改,outlook中只是修改编辑器中的字体,和纯文本邮件浏览的字体,不能更改未指定字体的HTML邮件的显示字体。 …

TensorFlow2实战-系列教程5:猫狗识别2------数据增强

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 猫狗识别1 数据增强 猫狗识别2------数据增强 猫狗识别3------迁移学习 1、猫狗识别任…