Java 中的 LocalDateTime、DateTime 和 Date 的区别解析

news2024/11/14 5:27:29

目录

前言

一、LocalDateTime:新的 Java 8 日期时间 API

1.1 LocalDateTime 简介

1.2 设计理念

1.3 适用场景

1.4 示例代码

二、DateTime:没有明确标准的类

2.1 DateTime 的模糊性

2.2 适用场景

三、Date:老旧的日期时间类

3.1 Date 简介

3.2 设计缺陷

3.3 适用场景

3.4 示例代码

四、如何选择合适的日期时间类?


前言

hello 哥们,又碰见问题了。最近在写项目定义 createTime 和 updateTime 这类时间有关的属性时,我脑子里出现三个类, LocalDateTime、DateTime 和 Date  说起来,我确实有点分不清这三个类,于是特地去查了一下,于是有了此篇博客。

在 Java 中,处理日期和时间是开发中常见的任务之一,特别是在涉及到多个时区、日期格式、时间计算等需求时。Java 提供了多种方式来处理日期和时间,其中 LocalDateTimeDateTimeDate 是三种常见的日期时间类。尽管它们看起来有些相似,但它们的设计理念和应用场景却各有不同。本文将深入分析这三者的区别,帮助大家更好地理解它们的使用场景。


一、LocalDateTime:新的 Java 8 日期时间 API

1.1 LocalDateTime 简介

LocalDateTime 是 Java 8 中引入的 java.time 包的一部分,它代表了没有时区信息的日期和时间。它只包含 年、月、日、时、分、秒、纳秒 信息,不涉及与时区或具体的时间点相关的数据。

1.2 设计理念

LocalDateTime 设计的目标是解决传统 java.util.Date 类中存在的许多问题,提供一个清晰、直观的 API 来处理日期和时间。由于它没有时区信息,它非常适合表示 本地时间,例如在某个特定地点的时间,且不受时区转换的影响。

1.3 适用场景

  • 本地日期时间处理:例如,我们只关心某个事件发生的日期和时间,但不关心该事件发生的时区。
  • 与数据库交互:当你存储和操作不涉及时区的日期时间(比如某些日历系统或事务记录)时,LocalDateTime 是一个理想的选择。

1.4 示例代码

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();  // 获取当前的本地日期和时间
        System.out.println("当前本地日期时间: " + now);

        // 格式化输出
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("格式化后的日期时间: " + now.format(formatter));
    }
}

输出结果:

当前本地日期时间: 2024-11-13T12:45:30.123456789
格式化后的日期时间: 2024-11-13 12:45:30

二、DateTime:没有明确标准的类

2.1 DateTime 的模糊性

在 Java 标准库中,并没有直接命名为 DateTime 的类。通常,在一些库或框架中,DateTime 用来指代 日期和时间的组合。例如,Java 8 的 ZonedDateTimeLocalDateTime 都可能被通称为 DateTime,尽管它们是不同的类。

因此,DateTime 并没有明确的标准定义,通常只是作为一个通用术语,用来描述所有涉及日期和时间的类。

2.2 适用场景

  • 在一些第三方库(如 Joda-Time)或框架中,DateTime 被广泛用于表示日期和时间。如果使用这些库,可能会遇到 DateTime 这个类。
  • 在 Java 中,如果遇到 DateTime,我们可能需要进一步查看它具体是哪个类,例如 ZonedDateTime 或 OffsetDateTime

三、Date:老旧的日期时间类

3.1 Date 简介

java.util.Date 是 Java 中最早的日期和时间类之一。它代表自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数,直到 Java 8 被新的日期时间 API 取代。Date 类最初设计上存在诸多缺陷,因此不再推荐用于新的项目开发。

3.2 设计缺陷

  • 时区问题Date 类本身并不包含时区信息,且会根据所在的系统时区进行转换,导致时区处理不够精确。
  • 不便的 API:许多方法(如 getYear())的返回值并不直观,而且对日期的操作不便,缺少流畅的日期计算方法。
  • 精度不足Date 的精度仅限于毫秒,不能处理纳秒级别的时间。

3.3 适用场景

  • 兼容旧代码:如果你需要与旧版的 API 进行交互,Date 可能仍然是不可避免的。
  • 时间戳:由于 Date 内部使用毫秒表示时间,因此它仍然适用于一些需要表示时间戳的场景。

3.4 示例代码

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {
        Date date = new Date();  // 获取当前日期和时间
        System.out.println("当前日期时间: " + date);
    }
}

输出结果:

当前日期时间: Wed Nov 13 12:45:30 GMT 2024

四、如何选择合适的日期时间类?

特性LocalDateTimeDateTime(通常指 ZonedDateTimeOffsetDateTime 等)Date(旧的 java.util.Date
时区信息无时区信息ZonedDateTime 有时区信息,LocalDateTime 没有时区信息Date 依赖于系统时区
精确度纳秒精度视具体类型而定,如 ZonedDateTime 支持到纳秒精度毫秒精度
设计方式Java 8 引入的新日期时间 API,推荐使用DateTime 不是标准类,通常是指 LocalDateTime 或 ZonedDateTime 等旧的 API,设计不够清晰,容易出错
功能只包含日期和时间,没有时区包含日期和时间,可以有时区(如 ZonedDateTime仅表示一个时间点,设计较为原始
使用推荐推荐用于不需要时区的日期时间操作ZonedDateTime 或 OffsetDateTime 用于处理带时区的日期时间不推荐使用,除非需要兼容旧代码

1. LocalDateTime:适用于本地日期和时间的场景,不需要时区处理。

2. ZonedDateTime:适用于需要时区处理的场景,适合跨时区的日期时间计算。

3. Date:仅在兼容旧代码或需要处理时间戳时使用,不推荐在新项目中使用。

在 Java 8 之后,我更推荐使用新的日期时间 API(java.time 包中的类),这些类设计更加清晰,功能更强大,避免了 java.util.Date 中的很多问题。以上就是关于这三个日期时间类的所有内容,感谢阅览!!

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

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

相关文章

【数字图像处理+MATLAB】对图片进行伽马校正(Gamma Correction):使用幂律变换公式进行伽马变换

引言 伽马校正(Gamma Correction)是一种用于图像处理的技术,主要用于调整图像的亮度或对比度。其基本原理是对图像的每一个像素应用一个非线性变换,以更好地适应人眼的视觉感知。在数字图像处理中,伽马校正通常用于调…

scala 迭代更新

在Scala中,迭代器(Iterator)是一种用于遍历集合(如数组、列表、集合等)的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素,而无需关心集合的具体实现。 在Scala中&#xff0c…

部署zabbix遇到问题: cannot find a valid baseurl for repo:centos-sclo-rh/x86 64 怎么解决 ?

安装 Zabbix 前端包,提示cannot find a valid baseurl for repo:centos-sclo-rh/x86 64 安装zabbix前端包 # yum install zabbix-web-mysql-scl zabbix-apache-conf-scl 解决办法: 原因是:CentOS7的SCL源在2024年6月30日停止维护…

SpringBoot(十九)创建多模块Springboot项目(完整版)

之前我有记录过一次SpringBoot多模块项目的搭建,但是那一次只是做了一个小小的测试。只是把各模块联通之后就结束了。 最近要增加业务开发,要将目前的单模块项目改成多模块项目,我就参照了一下我上次搭建的流程,发现总是有报错。上次搭建的比较顺利,很多细枝末节也没有仔细…

基于Python的智能无人超市管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

什么是量化交易

课程大纲 内容初级初识量化,理解量化 初识量化 传统量化和AI量化的区别 量化思想挖掘 量化思想的挖掘及积累技巧 量化代码基础: python、pandas、SQL基础语法 金融数据分析 常用金融分析方式 常用因子分析方式 数据分析实战练习 回测及交易引擎 交易引擎…

xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer

打开 .sh 文件所在的终端窗口,执行终端命令:sh 文件名.sh,出现如下错误: 解决办法:

PETR/PETRv2/StreamPETR论文阅读

1. PETR PETR网络结构如下,主要包括image-backbone,3D Coordinates Generator,3D Position Encoder,transformer Decoder四个模块。 把N 个视角的图像输入到骨干网络中以提取 2D 多视图特征。在 3D 坐标生成器中,首先…

除了 Postman,还有什么好用的 API 调试工具吗

尽管 Postman 拥有团队协作等实用特性,其免费版提供的功能相对有限,而付费版的定价可能对小团队或个人开发者而言显得偏高。此外,Postman 的访问速度有时较慢,这可能严重影响使用体验。 鉴于这些限制,Apifox 成为了一…

程序员做自媒体,你所不了解的提词器,原来还有这么多大用处

程序猿的出路,不只是外卖员! 你或许以为提词器只是个“背词神器”?实际上,它的应用范围早已超出你的想象。从直播到会议,从视频拍摄到户外采访,每一种场景都有对应的提词神器,帮你提升效率、避…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

JS 实现WebSocket通讯和什么是WebSocket

WebSocket 介绍: WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信。它允许服务器主动向客户端推送信息,客户端也能实时接收服务器的响应。 客户端 这里实现了将input内的内容发送给客户端,并将接收到的服务器的…

前端 JS面向对象 继承

目录 一、ES5通过prototype来继承 二、ES6 class实现 一、ES5通过prototype来继承 const Person{eyes:2,head:1}function Woman(){}Woman.prototypePersonconst ladynew Woman()console.log(lady)function Man(){}Man.prototypePersonconst mannew Man()console.log(man) 打…

三菱FX5UPLC以太网Socket通信功能Passive开放的程序示例

Passive开放的通信流程如下所示。 参数设置 示例程序中使用的参数设置如下所示。 [CPU模块】 导航窗口↔[参数]↔[模块型号]↔[模块参数]-[以太网端口]-[基本设置]-[对象设备连接配置设置]↔[详细设置]→[以太网配置(内置以太网端口)]画面 【以太网模块】 [导航]中「参数]→[模…

UniApp 应用、页面与组件的生命周期详解

UniApp 应用、页面与组件的生命周期详解 在uni-app中包含了 应用生命周期、页面生命周期、和组件生命周期&#xff08; Vue.js的&#xff09;函数。 应用生命周期 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 <script>export default {onLaunc…

Optimism掀起发链热潮,还有哪些发链 平台值得关注?

继电子巨头索尼在OP上发布L2 Soneium之后&#xff0c;10月29日&#xff0c;再质押协议巨头Swell宣布迁移至Optimism超级链&#xff0c;通过OP Stack构建Rollup加入OP生态系统。据DeFilama数据显示&#xff0c;Swell的TVL最高曾超过30亿美元&#xff0c;目前为13.4亿美元&#x…

0. 0:《跟着小王学Python·新手》

《跟着小王学Python新手》系列 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的核心概念。通过开发游戏、构…

如何优化Kafka消费者的性能

要优化 Kafka 消费者性能&#xff0c;你可以考虑以下策略&#xff1a; 并行消费&#xff1a;通过增加消费者组中的消费者数量来并行处理更多的消息&#xff0c;从而提升消费速度。 批量消费&#xff1a;配置 fetch.min.bytes 和 fetch.max.wait.ms 参数来控制批量消费的大小和…

Golang | Leetcode Golang题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; func nextGreaterElement(n int) int {x, cnt : n, 1for ; x > 10 && x/10%10 > x%10; x / 10 {cnt}x / 10if x 0 {return -1}targetDigit : x % 10x2, cnt2 : n, 0for ; x2%10 < targetDigit; x2 / 10 {cnt2}x x2%10 -…

AscendC从入门到精通系列(一)初步感知AscendC

1 什么是AscendC Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。基于Ascend C编写的算子程序&#xff0c;通过编译器编译和运行时调度&#xff0c;运行在昇腾AI处理器上。使用Ascend C&#xff0c;开发者…