当前位置: 首页 > news >正文

【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 更加推荐,可以让代码更加清晰、易读和可维护。

三、区别

当处理日期时,使用 DateLocalDate 这两种类型有着不同的优缺点。让我们来比较一下它们,并从几个方面讨论它们的使用:

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 线性链表的基本操作如下&#xff1a; #include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define ElemType inttyped…...

Docker安装Gitlab

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

浅淡 C++ 与 C++ 入门

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

学习和认知的四个阶段,以及学习方法分享

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

Python编程从入门到实践中的一些误区

1.num 使用num时python报错&#xff0c;后来查过后才知道是因为python不支持自增或自减&#xff0c;可以用1。 2.字符串和非字符串连接 要先将非字符串转换为字符串类型之后才能连接 print&#xff08;2int&#xff08;‘2’&#xff09;&#xff09;#4 3.关键字参数必须在未…...

Kanebo HITECLOTH 高科技擦镜布介绍

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

政务云安全风险分析与解决思路探讨

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

Linux tcpdump抓包转Wireshark 分析

简介 tcpdump 是Linux系统下的一个强大的命令&#xff0c;可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;本文将展示如何使用 tcpdump 抓包&#xff0c;以及如何用 tcpdump 和 wireshark 分析网络流量 tcpdump指…...

【Spring高级】Aware与InitializingBean接口

目录 Aware接口概述为什么需要Aware接口 InitializingBean接口Autoware失效分析 Aware接口 概述 在Spring框架中&#xff0c;Aware 接口是一种常用的设计模式&#xff0c;用于允许bean在初始化时感知&#xff08;或获取&#xff09;Spring容器中的某些资源或环境信息。这些接…...

打造你的HTML5打地鼠游戏:零基础入门教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

C++默认构造函数/拷贝构造函数/赋值构造函数

概述 本文主要讲解C默认构造函数&#xff0c;拷贝构造函数和赋值构造函数在哪些场景下会被调用到 代码 类定义 class A{public:A() { cout<<"construct function"<<endl; }A(const A& other) { cout<<"copy construct function"…...

前端框架的发展历史介绍

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

Linux 基本命令

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

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展&#xff0c;固态硬盘&#xff08;Solid State Drive&#xff0c;简称SSD&#xff09;已成为现代电脑的标配。相较于传统的机械硬盘&#xff0c;固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是&#xff0c;对于不熟悉电脑硬件的用户来说&#xff0…...

在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!

写在开头 经过上几篇博文的学习&#xff0c;我们知道在Java中可以通过new Thread().start()创建一个线程&#xff0c;那今天我们就来思考另外一个问题&#xff1a;线程的终止 自然终止有两种情况&#xff1a; 1. 线程的任务执行完成&#xff1b; 2. 线程在执行任务过程中发生异…...

指数函数与三角函数乘积的积分公式

先上公式&#xff0c;公式正确&#xff0c;用欧拉公式即可证明。 数学公式不好打字&#xff0c;我就发截图。 欧拉公式证明如下&#xff1a;...

代码随想录算法训练营第五九天 | 下一个更大元素II、接雨水

目录 下一个更大元素II接雨水 LeetCode 503.下一个更大元素II LeetCode 42. 接雨水 下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...