0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java时间类转换方案

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 15:48 次阅读

众所周知,Java 8 之前的 Date 相关的时间类非常的不好用。从 Java 8 之后开始加入了 LocalDate 等一系列更加现代化的时间类。

这就衍生出 Java 8 之前的 Date 需要和 LocalDate 互相转换的需求。今天把这几年积累下来的转换代码分享给大家。

java.util.Date 与 java.time.LocalDate 之间的转换

在 Date 转换 LocalDate 的过程中,我们使用 Date 类中在 Java 8 新增的 toInstant() 方法进行转换。

当我们转换一个 Instant 对象时,需要使用 ZoneId,因为 Instant 对象是不分时区的--只是时间线上的点。

Instant 对象的 atZone(ZoneId zone) API 返回一个 ZonedDateTime,所以我们只需要使用 toLocalDate() 方法从中提取 LocalDate。

在这里我们使用的是系统默认的 ZoneId。

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
    return dateToConvert.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

还有一个类似的解决方案,但不同的方式来创建一个 Instant 对象--使用 ofEpochMilli() 方法。

public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
    return Instant.ofEpochMilli(dateToConvert.getTime())
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

在我们继续之前,让我们也快速看一下旧的 java.sql.Date 类,以及它是如何被转换为 LocalDate 的。

从 Java 8 开始,我们可以在 java.sql.Date 上找到一个额外的 toLocalDate() 方法,这也给了我们一个将其转换为 java.time.LocalDate 的简单方法。

在这种情况下,我们不需要担心时区的问题。

public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
    return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}

将 Date 转换为 LocalDateTime

为了得到一个 LocalDateTime 实例,我们同样可以使用一个中间的 ZonedDateTime,然后使用 toLocalDateTime() API。

就像以前一样,我们可以使用两种可能的解决方案来从java.util.Date中获得一个即时对象。

public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
    return dateToConvert.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDateTime();
}

public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
    return Instant.ofEpochMilli(dateToConvert.getTime())
      .atZone(ZoneId.systemDefault())
      .toLocalDateTime();
}

从Java 8开始,我们也可以使用java.sql.Timestamp来获得一个LocalDateTime。

public LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
    return new java.sql.Timestamp(
      dateToConvert.getTime()).toLocalDateTime();
}

将 LocalDate转换为 Date

现在我们已经很好地理解了如何从旧的数据表示法转换为新的数据表示法,让我们来看看另一个方向的转换。

我们将讨论将LocalDate转换为Date的两种可能方式。

第一种,我们使用java.sql.Date对象中提供的一个新的valueOf(LocalDate date)方法,它把LocalDate作为一个参数

public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
    return java.sql.Date.valueOf(dateToConvert);
}

正如我们所看到的,它毫不费力,而且很直观。它使用本地时区进行转换(所有的工作都在引擎盖下完成,所以不用担心)。

在另一个Java 8的例子中,我们使用一个Instant对象,并将其传递给java.util.Date对象的from(Instant instant)方法。

public Date convertToDateViaInstant(LocalDate dateToConvert) {
    return java.util.Date.from(dateToConvert.atStartOfDay()
      .atZone(ZoneId.systemDefault())
      .toInstant());
}

注意我们在这里使用了一个即时对象,而且在做这个转换时我们还需要关心时区。

接下来,让我们使用一个非常类似的解决方案,将LocalDateTime转换为Date对象。

将java.time.LocalDateTime转换为java.util.Date

从 LocalDateTime 获得java.util.Date的最简单方法是使用java.sql.Timestamp的扩展--在Java 8中可用。

public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
    return java.sql.Timestamp.valueOf(dateToConvert);
}

但当然,另一个解决方案是使用一个 Instant 对象,我们从ZonedDateTime中获得这个对象。

Date convertToDateViaInstant(LocalDateTime dateToConvert) {
    return java.util.Date
      .from(dateToConvert.atZone(ZoneId.systemDefault())
      .toInstant());
}

Java 9的新增功能

在 Java 9 中,有一些新方法可以简化java.util.Date和java.time.LocalDate或java.time.LocalDateTime之间的转换。

LocalDate.ofInstant(Instant instant, ZoneId zone) 和 LocalDateTime.ofInstant(Instant instant, ZoneId zone) 提供了方便的快捷方式。

public LocalDate convertToLocalDate(Date dateToConvert) {
    return LocalDate.ofInstant(
      dateToConvert.toInstant(), ZoneId.systemDefault());
}

public LocalDateTime convertToLocalDateTime(Date dateToConvert) {
    return LocalDateTime.ofInstant(
      dateToConvert.toInstant(), ZoneId.systemDefault());
}

总结

在这篇文章中,介绍了将旧的java.util.Date转换为新的java.time.LocalDate和java.time.LocalDateTime的方式方法。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6989

    浏览量

    88931
  • JAVA
    +关注

    关注

    19

    文章

    2964

    浏览量

    104686
收藏 人收藏

    评论

    相关推荐

    java rules下载/java规范中文版

    转义序列1.6.3 字符串直接量1.6.4 数值直接量1.6.5 直接量1.7 分隔符1.8 操作符第2章 编译单元2.1 引言2.2 体声明中的术语2.2.1 Java中对成员变量的定义
    发表于 06-23 18:16

    JAVA语言的抽象封装与

    JAVA语言的抽象封装与5.1 抽象与封装5.2 Java5.3 的修饰符5.4 域5.5 方法5.6 访问控制符面向对象的程序设计
    发表于 12-14 20:33 45次下载

    JAVA语言的工具与算法

    JAVA语言的工具与算法6.1 语言基础库;            
    发表于 12-14 20:34 66次下载

    Java

    1.1 有关面向对象的概念1.2 Java语言的特点1.3 Java的开发环境1.4  第一个Java程序1.5 Java类型系统1.6
    发表于 04-28 14:23 0次下载

    JAVA常用系统的使用 实验

    实验 6 常用系统的使用 一、实验目的 了解 Java 常用的系统,包括 Java Applet、字符串、输入输出流
    发表于 09-23 19:01 1748次阅读

    Java与对象程序设计基础

    Java与对象程序设计基础 一、实验目的:      通过编制一个独立应用程序,使得学生掌握Java的系统所提供的引用方法;通过编制一个
    发表于 12-05 23:55 2804次阅读

    28个java常用的工具

    28个java常用的工具
    发表于 11-06 11:30 3次下载

    Java常用工具

    Java常用工具
    发表于 11-06 11:21 1次下载

    Java数组的常用方法_Java:数组工具Arrays的常用方法的用法及代码

    本文主要详细介绍了Java数组的常用方法以及数组工具Arrays的常用方法的用法及代码。
    发表于 01-29 10:25 2918次阅读

    Java教程之零点起飞学Java与对象资料说明

    与对象是进行面向对象编程的基础。是具有相同属性特征和行为规则的多个对象的一种统一描述,对象是对的实例化。在Java语言中,是一种最基
    发表于 02-20 10:41 14次下载
    <b class='flag-5'>Java</b>教程之零点起飞学<b class='flag-5'>Java</b>的<b class='flag-5'>类</b>与对象资料说明

    Java实验:和对象的扩展

    Java实验:和对象的扩展
    发表于 07-08 15:36 20次下载
    <b class='flag-5'>Java</b>实验:<b class='flag-5'>类</b>和对象的扩展

    Java时间戳的使用

    Java时间戳的使用
    的头像 发表于 11-06 16:04 182次阅读
    <b class='flag-5'>Java</b>中<b class='flag-5'>时间</b>戳的使用

    java接口是特殊的抽象

    Java接口是一种特殊的抽象吗? 在Java编程语言中,接口(interface)与抽象(abstract class)是两种不同的概念,尽管它们之间存在一些相似之处,但在设计和使
    的头像 发表于 11-21 10:07 635次阅读

    java的主必须是public

    Java中,主是指程序的入口,也就是程序开始执行的地方。一般来说,Java需要是public
    的头像 发表于 11-28 16:15 5580次阅读

    java源程序是由定义组成的吗

    Java源程序是由定义组成的。在Java中,是用来定义对象的一种结构化方式。一个可以包含字段(变量)和方法(函数),它们一起描述了对象
    的头像 发表于 11-28 16:36 650次阅读