Java 中的 LocalDateTime、DateTime 和 Date 的区别解析
目录
前言
一、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 提供了多种方式来处理日期和时间,其中 LocalDateTime
、DateTime
和 Date
是三种常见的日期时间类。尽管它们看起来有些相似,但它们的设计理念和应用场景却各有不同。本文将深入分析这三者的区别,帮助大家更好地理解它们的使用场景。
一、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 的 ZonedDateTime
和 LocalDateTime
都可能被通称为 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
四、如何选择合适的日期时间类?
特性 | LocalDateTime | DateTime (通常指 ZonedDateTime 、OffsetDateTime 等) | 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
中的很多问题。以上就是关于这三个日期时间类的所有内容,感谢阅览!!
相关文章:
Java 中的 LocalDateTime、DateTime 和 Date 的区别解析
目录 前言 一、LocalDateTime:新的 Java 8 日期时间 API 1.1 LocalDateTime 简介 1.2 设计理念 1.3 适用场景 1.4 示例代码 二、DateTime:没有明确标准的类 2.1 DateTime 的模糊性 2.2 适用场景 三、Date:老旧的日期时间类 3.1 Da…...

MATLAB引用矩阵元素的几种方法
引用矩阵元素可以通过索引,也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素,例如: - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1,用 A ( ) A() A()提取即可, A A A为原矩阵的名称。 例如&…...

Linux、File System、Linux基本常用命令
一、File System 文件系统 Linux文件系统是操作系统用来组织、管理和存储问价及目录结构的方式。它不仅定义了如何将数据保存到磁盘上,还规定了用户如何与这些数据进行交互。 1、层次结构 根目录(/):所有文件和目录都从根目录开始…...
大数据治理:开启数据价值挖掘之旅
在当今数字化时代,数据呈爆炸式增长,大数据已经渗透到各个行业和领域,成为企业竞争和创新的关键驱动力。而大数据治理作为有效管理和利用大数据资源的核心手段,在教学领域也具有至关重要的地位。 一、大数据治理的内涵与重要性 大…...

Linux排查cpu运行负载过高
方式1:top 先输入top再输入1,查看 %CPU 列,找出占用 CPU 最多的进程 作用:切换显示每个逻辑 CPU 的使用情况。效果: 如果系统有多个 CPU 核心或超线程逻辑处理器,按下 1 会使得 top 分别显示每个逻辑 CPU…...

Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本
14.1、什么是Aggressor脚本 Aggressor Script 是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggressor 脚本允许你修改和扩展 Cobalt Strike 客户端。 历史 Aggressor Script 是 Armitage 中开源脚本引擎Cortana的精神继承者。Cortana 是通过与 DARPA 的网络快速跟踪计…...
C++并发与多线程(高级函数async)
async 在 C 中,async 关键字用于实现异步编程,它允许你定义异步操作,这些操作可以在后台执行,而不会阻塞当前线程。这是 C11 引入的特性,与 std::async 函数和 std::future 类一起使用。与thread函数模板的区别在于as…...

安卓课设版算法计算器
安卓课设版算法计算器(HNUST) 前言: 如果只想看函数使用说明请跳转到“四、使用函数介绍” 该版本为课设版,富含多个界面,是前版的plus版本,进行了更多的复杂化操作,故因此会觉得对于计算器有点…...

X-Forwarded-For注入漏洞
0x00环境介绍 靶机http://219.153.49.228:48033,通过注入完成找到网站的key。 1|00x01复现过程 1.访问网站使用admin/admin登入,用burpsuite截包寻找注入点 >>截到的包,正常放包回显内容 >>加X-forwarded-for:1.1.1.1回显IP数据改变&…...

Linux - MySQL迁移至一主一从
Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL,请参考Linux - MySQL安装,迁移数据量比较大约400G左右且网络不通故使用文件迁移,需开启一段时间…...

《变形金刚:赛博坦的陨落》游戏启动难题:‘buddha.dll’缺失的七大修复策略
《变形金刚:赛博坦的陨落》游戏启动时提示buddha.dll缺失:原因与解决方案 作为一名软件开发从业者,我在日常工作中经常遇到电脑游戏运行时出现的各种问题,如文件丢失、文件损坏和系统报错等。今天,我们就来探讨一下《…...

51c嵌入式~单片机~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…...
java Resource 记录
Java 注解 Resource 是一个标准的 Java 注解,用于注入资源。它可以用于注入任何资源,如文件、数据库连接、用户定义的资源等。它可以通过名称或类型进行注入。 当你想要注入一个bean到你的类中时,你可以使用Resource注解。 解决方案1&#…...
Avalonia 开发环境准备
总目录 前言 介绍如何搭建 Avalonia 开发环境。 一、在线开发环境搭建 请先安装您选择的受支持的IDE。Avalonia 支持 Visual Studio、Rider 和 Visual Studio Code。 详见:https://docs.avaloniaui.net/zh-Hans/docs/get-started/install 1. 使用 Visual Studio 20…...
C# 中 Console.WriteLine($“{DateTime.Now.Date}“); win 和 docker容器输出不同
Console.WriteLine($"{DateTime.Now.Date}"); //windowns输出:2024/12/10 0:00:00 //docker容器输出:12/10/2024 00:00:00 这是由于 不同的文化区域(CultureInfo)设置 导致的时间格式差异。在 Windows 系统…...

回型矩阵:JAVA
解题思路: 通过定义四条边界;top,left,right,bottom,来循环,当top>bottom&&left>right的时候循环终止 循环结束的条件: 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述…...
从零开始学习 sg200x 多核开发之 sophpi 编译生成 fip.bin 流程梳理
本文主要介绍 sophpi 编译生成 fip.bin 流程。 1、编译前准备 sophpi 的基本编译流程如下: $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注: 需要在 bash 下运行clean_all 非必要可以不…...

python--在服务器上面创建conda环境
今天刚开始使用服务器的时候使用上面的公共环境发现老师缺少模块, [guoyupingcins195 ~]$ conda --version Traceback (most recent call last): File "/home/miniconda3/bin/conda", line 12, in <module> from conda.cli import main Fil…...

day15 python(3)——python基础(完结!!)
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、函数 1.1 函数传参中的拆包 1.2 匿名函数的定义 1.3 匿名函数练习 1.4 匿名函数应用——列表中的字典排序 2、面向对象 OOP 2.1 面向对象介绍 2.2 类和对象 2.3 类的构成和设计 2.4 面向对象代码…...
/:087启动游戏时提示丢失”d3dx···.dll””VCOMP···.dll”
/:087启动游戏时提示丢失”d3dx.dll””VCOMP.dll”或遇到应用程序无法正常启动(0xc000007b)和游戏有图像没有声音等情况。 主要是因为系统缺少大型游戏/软件运行的必备组件,这些组件有DirectX,Visual C2010,2012&…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...