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

    文章

    6512

    浏览量

    87601
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102995
收藏 人收藏

    评论

    相关推荐

    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从代码到运行的过程 用一个图来描述这个过程会比较容易理解:(链接地址:http://hiphotos.baidu.com/javass/pic/item
    发表于 10-31 11:44

    JAVA语言的数据类型转换

    JAVA语言的数据类型转换很多场合需要用到类型转换。例如,要把一个整型变量作为字符型变量来使用,就需要使用类型转换,即把整型变量转换为字符型
    发表于 12-06 00:30

    Java的产生与特点

    ;Java是Sun公司推出的新的一代面向对象程序设计语言,特别适合于Internet应用程序开发,它的平台无关性直接威胁到Wintel的垄断地位。一时间,“连Internet,用Java编程”,成为技术人员
    发表于 12-14 20:28

    [转帖]java学习心得总结

    JAVA中最经常听到词,也是最麻烦的东西。 4、变量常量:JAVA的常量名一般用全大写字母表示,并且为了节省内存,一般定义为静态(JAVA程序中的名字我们经常有个默认的规则,
    发表于 12-20 12:08

    JAVA和C++区别

    JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。 5.操作符重载 Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然
    发表于 04-11 15:19

    JAVA和C++区别

    JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。 5.操作符重载 Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然
    发表于 10-10 14:50

    Java中的常用异常处理方法 java推荐

    finally 代码块中,可以运行清理类型等收尾善后性质的语句。声明自定义异常在Java中可以自定义异常,在自定义异常时需注意以下几点:1. 所有异常都必须是 Throwable 的子类;2. 自定义
    发表于 01-19 17:26

    Java入门需要学习什么?

    Java是编程界的常青树,虽然存在时间很长了,但是一直广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境
    发表于 03-01 15:45

    Java和C++的区别

    JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。 5.操作符重载 Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然
    发表于 09-13 16:02

    Java 那些最常用的工具

    = stopwatch.elapsed(TimeUnit.SECONDS);TimeUnit 可以指定时间精度。Joda Timejdk1.8之前,日期操作常用的只有java
    发表于 06-15 17:18

    Java语言的特性介绍

    ,大大简化了程序设计人员的资源释放管理工作。  Java提供了丰富的库、API文档以及第三方开发包,另外还有大量基于Java的开源项目。JDK(Java开发者工具箱)已经开放源代码,
    发表于 01-20 14:44

    如何用java映射创建java对象和调用java对象呢

    。一、首先我们要知道这个java的包名和名。调用静态方法Class.forName(String)获取Class对象。二、然后我们要知道要调用的方法的声明。调用Class对象的getMethod获取
    发表于 04-11 14:43

    JAVA教程之时间日期服务器

    JAVA教程之时间日期服务器,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 7次下载

    Java时间戳的使用

    当前时间 import java.sql.Timestamp; //导包 Timestamp nowTime = new Timestamp(System.currentTimeMillis
    的头像 发表于 01-13 15:30 516次阅读