衡阳派盒市场营销有限公司

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

    文章

    7139

    瀏覽量

    89573
  • JAVA
    +關注

    關注

    19

    文章

    2974

    瀏覽量

    105138
收藏 人收藏

    評論

    相關推薦

    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 ?1754次閱讀

    Java與對象程序設計基礎

    Java與對象程序設計基礎 一、實驗目的:      通過編制一個獨立應用程序,使得學生掌握Java的系統所提供的引用方法;通過編制一個
    發表于 12-05 23:55 ?2820次閱讀

    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 ?2938次閱讀

    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 ?271次閱讀
    <b class='flag-5'>Java</b>中<b class='flag-5'>時間</b>戳的使用

    java接口是特殊的抽象

    Java接口是一種特殊的抽象嗎? 在Java編程語言中,接口(interface)與抽象(abstract class)是兩種不同的概念,盡管它們之間存在一些相似之處,但在設計和使
    的頭像 發表于 11-21 10:07 ?684次閱讀

    java的主必須是public

    Java中,主是指程序的入口,也就是程序開始執行的地方。一般來說,Java需要是public
    的頭像 發表于 11-28 16:15 ?5869次閱讀

    java源程序是由定義組成的嗎

    Java源程序是由定義組成的。在Java中,是用來定義對象的一種結構化方式。一個可以包含字段(變量)和方法(函數),它們一起描述了對象
    的頭像 發表于 11-28 16:36 ?717次閱讀
    百家乐官网投注玩多少钱| 金鼎百家乐局部算牌法| 百家乐官网投注心得| 游戏百家乐的玩法技巧和规则| 澳门百家乐官网是骗人的| 百家乐平注常赢玩法更| 三公百家乐官网玩法| 德州扑克大师| 百家乐庄闲的冷热| 百家乐官网娱乐网站| 劳力士百家乐的玩法技巧和规则| 澳门百家乐官网赌博技巧| 大赢家娱乐场| BB百家乐大转轮| 百家乐官网五湖四海娱乐场| 凯斯娱乐城| 菲律宾百家乐娱乐场| 网上百家乐官网打牌| 娱乐论坛| 首席百家乐的玩法技巧和规则| 温州百家乐官网的玩法技巧和规则| 通城县| 百家乐网页qq| 养狗对做生意风水好吗| 百家乐官网的规则博彩正网| 456棋牌官网| 金樽百家乐的玩法技巧和规则| 捷豹百家乐官网的玩法技巧和规则 | 百家乐官网电子作弊器| 百家乐官网唯一能长期赢钱的方法 | 百家乐官网赌博娱乐城大全| 大发888下载安装| 做生意佩戴什么纳财| 东莞百家乐的玩法技巧和规则 | 女优百家乐官网的玩法技巧和规则| 寒江博彩堂| 大发888老虎机游戏| 百家乐定位膽技巧| 百家乐官网博娱乐网赌百家乐官网| 奉贤区| 德州扑克网上平台|