当前位置: 首页 > 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,因为它更加现代化、易用和功能强大。

http://www.lryc.cn/news/317000.html

相关文章:

  • 分布式链路追踪(一)SkyWalking(1)介绍与安装
  • 蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛
  • SCAU 8580 合并链表
  • Docker安装Gitlab
  • 浅淡 C++ 与 C++ 入门
  • 学习和认知的四个阶段,以及学习方法分享
  • Python编程从入门到实践中的一些误区
  • Kanebo HITECLOTH 高科技擦镜布介绍
  • 政务云安全风险分析与解决思路探讨
  • Linux tcpdump抓包转Wireshark 分析
  • 【Spring高级】Aware与InitializingBean接口
  • 打造你的HTML5打地鼠游戏:零基础入门教程
  • C++默认构造函数/拷贝构造函数/赋值构造函数
  • 前端框架的发展历史介绍
  • Linux 基本命令
  • 怎么查看电脑是不是固态硬盘?简单几个步骤判断
  • 在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
  • 指数函数与三角函数乘积的积分公式
  • 代码随想录算法训练营第五九天 | 下一个更大元素II、接雨水
  • LeetCode(力扣)算法题_2864_最大二进制奇数
  • 食药物质创新 赋能中式滋补健康产业发展交流会圆满结束
  • 用好大模型、承载“头雁领航”使命,央企如何三路出击?
  • LabVIEW飞机液压基础试验台测试系统
  • STM32第十课:串口发送
  • 淘宝扭蛋机小程序:探索未知的惊喜之旅
  • [nlp入门论文精读] | Transformer
  • 科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」
  • 代码随想录算法训练营第五十九天丨503. 下一个更大元素 II、42. 接雨水
  • 全代码分享|R语言孟德尔随机化怎么做?TwoSampleMR包MR一套标准流程
  • 【AI视野·今日NLP 自然语言处理论文速览 第八十四期】Thu, 7 Mar 2024