【JAVA】Date、LocalDate、LocalDateTime 详解,实践应用
Date、LocalDate、LocalDateTime 详解,实践应用
- 一、Date、LocalDate 简介
- 1、 `java.util.Date`:
- 2、 `java.time.LocalDateTime`:
- 3、 `java.time.LocalDate`:
- 二、输出格式
- 1、使用 java.util.Date 的示例代码如下:
- 2、使用 java.time.LocalDateTime 的示例代码如下:
- 三、区别
- 1、表示的范围:
- 2、线程安全性:
- 3、可读性和易用性:
- 4、时区:
- 四、项目中的使用
- 1、数据库中的数据是date类型,在实体类中对应什么类型?
- (1)使用 java.sql.Date:
- (2)使用 java.time.LocalDate:
- 2、数据库中的数据是time类型,在实体类中对应什么类型?
- (1)使用 java.sql.Time:
- (2)、使用 java.time.LocalTime:
一、Date、LocalDate 简介
在 Java 中,处理日期和时间的方式经历了演变。在 Java 8 之前,主要使用 java.util.Date 类来表示日期和时间,但它存在一些问题,如不可变性、线程安全性等。Java 8 引入了新的日期时间 API,位于 java.time 包中,提供了更加强大、易用和安全的日期时间处理方式。以下是对于不同类型的时间表达的详细解释:
1、 java.util.Date
:
是 Java 中早期用于表示日期和时间的类。 表示一个特定的日期和时间,以自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数来表示。 不可变的,表示一个时间点,但是其设计存在一些问题,如线程不安全、设计上不够清晰等。
2、 java.time.LocalDateTime
:
是 Java 8 中引入的日期时间类之一,位于 java.time 包中。 表示不带时区的日期和时间,即一个本地的日期时间,不受时区影响。使用 LocalDateTime.now() 来获取当前本地日期时间。 例如LocalDateTime.of(2022, Month.JANUARY, 1, 12, 0)
可以创建一个表示 2022 年 1 月 1 日中午 12 点的 LocalDateTime 对象。
3、 java.time.LocalDate
:
也是 Java 8 中引入的日期时间类之一,位于 java.time 包中。 表示日期,即年、月、日,不包含时间信息。 使用 LocalDate.now() 来获取当前本地日期。 例如,LocalDate.of(2022, Month.JANUARY, 1)
可以创建一个表示 2022 年 1 月 1 日的 LocalDate 对象。
二、输出格式
当在项目中使用日期时间处理时,新的日期时间 API 提供了更加清晰和灵活的方式。让我们来比较一下使用旧的 java.util.Date 和新的 java.time.LocalDateTime 在项目中的用法和输出。
假设我们有一个需求:在系统中记录用户创建账户的时间,并输出到日志中。
1、使用 java.util.Date 的示例代码如下:
import java.util.Date;public class AccountService {public void createUserAccount() {// 创建用户账户的业务逻辑Date creationDate = new Date();// 记录创建账户的时间到日志System.out.println("User account created on: " + creationDate);}
}
2、使用 java.time.LocalDateTime 的示例代码如下:
import java.time.LocalDateTime;public class AccountService {public void createUserAccount() {// 创建用户账户的业务逻辑LocalDateTime creationDateTime = LocalDateTime.now();// 记录创建账户的时间到日志System.out.println("User account created on: " + creationDateTime);}
}
现在我们来比较两者的输出:
假设我们在项目中的某个时间点创建了一个用户账户。
使用 java.util.Date 输出示例:
User account created on: Sun Mar 13 14:58:27 GMT 2024
使用 java.time.LocalDateTime 输出示例:
User account created on: 2024-03-13T14:58:27.327
可以看到,使用 java.time.LocalDateTime
输出的日期时间格式更加清晰和标准化,包含了年、月、日、时、分、秒和毫秒,并且不受系统时区的影响。而使用 java.util.Date 输出的日期时间格式虽然也能表达时间,但格式不如 LocalDateTime 那样标准化,并且需要考虑时区等因素。因此,使用新的日期时间 API 更加推荐,可以让代码更加清晰、易读和可维护。
三、区别
当处理日期时,使用 Date
和 LocalDate
这两种类型有着不同的优缺点。让我们来比较一下它们,并从几个方面讨论它们的使用:
1、表示的范围:
- Date 类型:Date 类型表示自 1970 年 1 月 1 日以来的毫秒数。它包含了日期和时间的信息。
- LocalDate 类型:LocalDate 类型只表示日期,不包含时间信息。它提供了更加简单和直接的日期表示方式。
2、线程安全性:
- Date 类型:Date 类型是可变的,因此不是线程安全的。在多线程环境中使用 Date 类型需要额外的同步措施来确保线程安全。
- LocalDate 类型:LocalDate 类型是不可变的,因此线程安全。多个线程可以同时访问和使用 LocalDate 实例而无需担心并发问题。
3、可读性和易用性:
-
Date 类型:Date 类型的 API 相对复杂,而且在大多数情况下不提供直接的方法来处理日期。因此,它可能导致代码更加难以理解和维护。
-
LocalDate 类型:LocalDate 类型提供了清晰、简洁和易用的 API,使得处理日期变得更加直观和方便。例如,可以使用
plusDays()
、minusDays()
等方法来进行日期计算。用于对日期进行加减操作。这些方法允许你在不改变 LocalDate 实例本身的情况下,对日期进行简单的算术运算。-
plusDays(long daysToAdd)
方法:
这个方法接受一个长整型参数daysToAdd
,用于指定要添加的天数。它返回一个新的 LocalDate 实例,该实例表示在当前日期的基础上添加了指定的天数。
示例:LocalDate currentDate = LocalDate.now(); // 在当前日期的基础上加7天 LocalDate futureDate = currentDate.plusDays(7);
-
minusDays(long daysToSubtract)
方法:
这个方法接受一个长整型参数 daysToSubtract,用于指定要减去的天数。 它返回一个新的 LocalDate 实例,该实例表示在当前日期的基础上减去了指定的天数。
示例:LocalDate currentDate = LocalDate.now(); // 在当前日期的基础上减去7天 LocalDate pastDate = currentDate.minusDays(7);
这些方法提供了简单、直观的方式来执行日期计算,而不需要考虑月份、年份和闰年等复杂的问题。这样,你可以更加轻松地对日期进行加减操作,而不必担心日期的正确性。
-
4、时区:
- Date 类型:Date 类型表示的日期和时间是基于 UTC 时间的,需要考虑时区问题时可能会复杂一些。
- LocalDate 类型:LocalDate 类型不包含时区信息,仅表示本地日期,因此对于涉及时区问题的应用场景可能不太适用。
综上所述,如果你只需要处理日期而不涉及时间和时区信息,并且希望代码更加清晰和易读,那么推荐使用 LocalDate 类型。如果你需要同时处理日期和时间,并且需要考虑时区等问题,那么可能需要使用 Date 类型或者 java.time.LocalDateTime 类型。但是,尽量避免直接使用 Date 类型,推荐使用新的 java.time 包中提供的日期时间 API。
四、项目中的使用
1、数据库中的数据是date类型,在实体类中对应什么类型?
如果数据库中的数据类型是 Date,那么在 Java 的实体类中对应的类型通常是 java.sql.Date 或者 java.time.LocalDate。这取决于你使用的是老的 JDBC API 还是新的 java.time 包。
(1)使用 java.sql.Date:
如果你在项目中使用的是老的 JDBC API,并且数据库中的数据类型是 date,那么你可以在实体类中使用 java.sql.Date
来表示日期。java.sql.Date
对象表示 SQL DATE 类型,只包含日期部分,不包含时间。
例如:
import java.sql.Date;public class Entity {private Date dateColumn;// Getter and setter methods
}
(2)使用 java.time.LocalDate:
如果你在项目中使用的是新的 java.time 包,并且你希望在实体类中使用现代的日期时间 API,那么你可以使用 java.time.LocalDate
来表示日期。java.time.LocalDate
表示不带时间的日期,只包含年、月、日部分。
例如:
import java.time.LocalDate;public class Entity {private LocalDate dateColumn;// Getter and setter methods
}
无论你选择使用 java.sql.Date 还是 java.time.LocalDate,都可以在实体类中正确地映射数据库中 date 类型的数据。不过,推荐使用新的 java.time 包中的日期时间 API,因为它更加现代化、易用和功能强大。
2、数据库中的数据是time类型,在实体类中对应什么类型?
如果数据库中的数据类型是 time,在 Java 的实体类中对应的类型通常是 java.sql.Time 或者 java.time.LocalTime。同样,这取决于你使用的是老的 JDBC API 还是新的 java.time 包。
(1)使用 java.sql.Time:
如果你在项目中使用的是老的 JDBC API,并且数据库中的数据类型是 time,那么你可以在实体类中使用 java.sql.Time 来表示时间。
java.sql.Time 对象表示 SQL TIME 类型,只包含时间部分,不包含日期。
例如:
import java.sql.Time;public class Entity {private Time timeColumn;// Getter and setter methods
}
可以使用 System.currentTimeMillis()
方法来获取当前时间的毫秒数,然后将其转换为 Time 类型。例如:
import java.sql.Time;public class Main {public static void main(String[] args) {Time currentTime = new Time(System.currentTimeMillis());System.out.println("当前时间:" + currentTime);}
}
这将输出类似于 当前时间:15:30:45 的格式,其中 15:30:45 是当前时间的时分秒。
(2)、使用 java.time.LocalTime:
如果你在项目中使用的是新的 java.time 包,并且你希望在实体类中使用现代的日期时间 API,那么你可以使用 java.time.LocalTime 来表示时间。
java.time.LocalTime 表示不带日期的时间,只包含时、分、秒和纳秒部分。
例如:
import java.time.LocalTime;public class Entity {private LocalTime timeColumn;// Getter and setter methods
}
可以使用 LocalTime.now()
方法。例如:
import java.time.LocalTime;public class Main {public static void main(String[] args) {LocalTime currentTime = LocalTime.now();System.out.println("当前时间:" + currentTime);}
}
这也将输出类似于 当前时间:15:30:45.123456789 的格式,其中 15:30:45.123456789 是当前时间的时分秒和纳秒。这个格式更加精确,包括了纳秒级别的精度。
无论你选择使用 java.sql.Time 还是 java.time.LocalTime,都可以在实体类中正确地映射数据库中 time 类型的数据。同样,推荐使用新的 java.time 包中的日期时间 API,因为它更加现代化、易用和功能强大。
相关文章:
【JAVA】Date、LocalDate、LocalDateTime 详解,实践应用
Date、LocalDate、LocalDateTime 详解,实践应用 一、Date、LocalDate 简介1、 java.util.Date:2、 java.time.LocalDateTime:3、 java.time.LocalDate: 二、输出格式1、使用 java.util.Date 的示例代码如下:2、使用 ja…...

分布式链路追踪(一)SkyWalking(1)介绍与安装
一、介绍 1、简介: 2、组成 以6.5.0为例,该版本下Skywalking主要分为oap、webapp和agent三部分,oap和webapp分别用于汇总数据和展示,这两块共同组成了Skywalking的平台;agent是探针,部署在需要收集数据的…...
蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛
一、题目 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意&…...
SCAU 8580 合并链表
8580 合并链表 时间限制:1000MS 代码长度限制:10KB 提交次数:3724 通过次数:2077 题型: 编程题 语言: G;GCC Description 线性链表的基本操作如下: #include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define ElemType inttyped…...

Docker安装Gitlab
下载镜像 直接下载最新版,比较大有2.36G docker pull gitlab/gitlab-ce创建数据存放的目录位置 按自己习惯位置创建目录 mkdir -p /usr/local/docker/docker_gitlab编写docker-compose.yml 在上面创建的挂载目录里面(/usr/local/docker/docker_gitl…...

浅淡 C++ 与 C++ 入门
我们知道,C语言是结构化和模块化的语言,适用于较小规模的程序。而当解决复杂问题,需要高度抽象和建模时,C语言则不合适,而C正是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库…...

学习和认知的四个阶段,以及学习方法分享
本文分享学习的四个不同的阶段,以及分享个人的一些学习方法。 一、学习认知的四个阶段 我们在学习的过程中,总会经历这几个阶段: 第一阶段:不知道自己不知道; 第二阶段:知道自己不知道; 第三…...

Python编程从入门到实践中的一些误区
1.num 使用num时python报错,后来查过后才知道是因为python不支持自增或自减,可以用1。 2.字符串和非字符串连接 要先将非字符串转换为字符串类型之后才能连接 print(2int(‘2’))#4 3.关键字参数必须在未…...

Kanebo HITECLOTH 高科技擦镜布介绍
Kanebo HITECLOTH,这款由日本KBSeiren公司制造的高科技擦镜布,以其卓越的清洁能力和超柔软的布质,成为了市场上备受瞩目的产品。 材质与特性 HITECLOTH采用0.1旦尼尔特级高级微纤维制造,质地细致、坚韧、不起颗粒。这种纤维的特…...

政务云安全风险分析与解决思路探讨
1.1概述 为了掌握某市政务网站的网络安全整体情况,在相关监管机构授权后,我们组织人员抽取了某市78个政务网站进行安全扫描,通过安全扫描,对该市政务网站的整体安全情况进行预估。 1.2工具扫描结果 本次利用漏洞扫描服务VSS共扫…...

Linux tcpdump抓包转Wireshark 分析
简介 tcpdump 是Linux系统下的一个强大的命令,可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,本文将展示如何使用 tcpdump 抓包,以及如何用 tcpdump 和 wireshark 分析网络流量 tcpdump指…...
【Spring高级】Aware与InitializingBean接口
目录 Aware接口概述为什么需要Aware接口 InitializingBean接口Autoware失效分析 Aware接口 概述 在Spring框架中,Aware 接口是一种常用的设计模式,用于允许bean在初始化时感知(或获取)Spring容器中的某些资源或环境信息。这些接…...

打造你的HTML5打地鼠游戏:零基础入门教程
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
C++默认构造函数/拷贝构造函数/赋值构造函数
概述 本文主要讲解C默认构造函数,拷贝构造函数和赋值构造函数在哪些场景下会被调用到 代码 类定义 class A{public:A() { cout<<"construct function"<<endl; }A(const A& other) { cout<<"copy construct function"…...

前端框架的发展历史介绍
前端框架的发展历史是Web技术进步的一个重要方面。从最初的简单HTML页面到现在的复杂单页应用程序(SPA),前端框架和库的发展极大地推动了Web应用程序的构建方式。以下是一些关键的前端框架和库,以及它们的发布年份、创建者和主要特…...

Linux 基本命令
文章目录 1.echo2.cd3.find4.mkdir5.cp6.rm7.wc8.tar9.tail10.vim11.grep12.sed13 touch14 ls15 快捷键16 ln17 mv18 useradd19 usermod20 su 每天一个Linux命令 提示:以下是本篇文章正文内容,下面案例可供参考 1.echo 中文 (Chinese): “回声” 或 “输…...

怎么查看电脑是不是固态硬盘?简单几个步骤判断
随着科技的发展,固态硬盘(Solid State Drive,简称SSD)已成为现代电脑的标配。相较于传统的机械硬盘,固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是,对于不熟悉电脑硬件的用户来说࿰…...

在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
写在开头 经过上几篇博文的学习,我们知道在Java中可以通过new Thread().start()创建一个线程,那今天我们就来思考另外一个问题:线程的终止 自然终止有两种情况: 1. 线程的任务执行完成; 2. 线程在执行任务过程中发生异…...

指数函数与三角函数乘积的积分公式
先上公式,公式正确,用欧拉公式即可证明。 数学公式不好打字,我就发截图。 欧拉公式证明如下:...

代码随想录算法训练营第五九天 | 下一个更大元素II、接雨水
目录 下一个更大元素II接雨水 LeetCode 503.下一个更大元素II LeetCode 42. 接雨水 下一个更大元素II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

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

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...