欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中各類日期和時間轉(zhuǎn)換超詳析總結(jié)(Date和LocalDateTime相互轉(zhuǎn)換等)

 更新時間:2025年01月18日 14:59:21   作者:狂奔的小棕棕  
這篇文章主要介紹了Java中日期和時間處理的幾個階段,包括java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Calendar和java.util.GregorianCalendar等類,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、前言

大家在開發(fā)過程中必不可少得和日期打交道,對接別的系統(tǒng)時,時間日期格式不一致,每次都要轉(zhuǎn)換!
從 Java1 到 Java8 將近 20 年,再加上 Java8 的普及時間、各種歷史 API 兼容過渡時間。我們很多時候需要在舊時間 API 與新時間 API 之間切換,并行使用?。。?br />每次寫完就忘記了,小編專門來整理一篇來詳細(xì)說一下他們轉(zhuǎn)換的方法,方便后面使用??!

在Java開發(fā)中,日期和時間的處理隨著JDK的迭代發(fā)展經(jīng)歷了幾個階段,從最初的java.util.Datejava.util.Calendar到Java 8(java.time包下的類)引入全新的日期時間API。現(xiàn)今在Java中,JDK提供了多種日期和時間相關(guān)類,主要包括以下幾種:

  • java.util.Date:這是Java最早提供的日期和時間類表示特定的時間瞬間,精確到毫秒??梢酝ㄟ^System.currentTimeMillis()來獲取當(dāng)前時間的毫秒表示。
  • java.sql.Date:這是為數(shù)據(jù)庫應(yīng)用設(shè)計的日期類,只包含年、月、日信息,不包含時間和時區(qū)信息。
  • java.sql.Time:類似java.sql.Date,但它只包含小時、分鐘和秒信息。
  • java.sql.Timestamp:這是一個比java.util.Date更加精確的時間戳類,它可以精確到納秒級別。
  • java.util.Calendarjava.util.GregorianCalendar:Calendar是一個抽象類,提供了日期和時間的計算方法。GregorianCalendarCalendar的一個具體實現(xiàn),用于處理公歷(格里高利歷)。
  • java.time包中的類:在Java 8及以上版本,推薦使用java.time包中的類來處理日期和時間,因為它們設(shè)計更加合理且功能更加強(qiáng)大。主要類包括LocalDate、LocalTime、LocalDateTimeZonedDateTime、InstantDuration、Period等。

二、日期格式轉(zhuǎn)換

LocalDateTime 和 Date 互相轉(zhuǎn)換

Date 轉(zhuǎn) LocalDateTime、LocalDate、LocalTime

要將java.util.Date轉(zhuǎn)換為LocalDate、LocalTime或LocalDateTime,可以使用java.time.Instant類作為中間橋梁,因為Instant類可以表示時間線上的一個瞬時點,與java.util.Date有相似的用途(盡管Instant是以UTC表示的,而Date是相對于默認(rèn)時區(qū)的)。

Java8 發(fā)行的時候,也考慮到了新舊 API 之間的轉(zhuǎn)換,所以在java.util.Date中增加了toInstance()方法,可以得到一個Instance實例。Instance表示時間線上的一個瞬時點,沒有時區(qū)概念,所以我們需要通過atZone()指定時區(qū),得到ZonedDateTime實例,然后轉(zhuǎn)換為java.time.LocalDateTime。

如下:

Date dateNow = new Date();

LocalDateTime localDateTime = dateNow.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime()

LocalDate localDate = dateNow.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();

LocalTime localTime = dateNow.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalTime();

同樣的,我們也可以借助Instance的ofEpochMilli()方法創(chuàng)建實例。如下:

Date dateNow = new Date();

LocalDateTime localDateTime = Instant.ofEpochSecond(dateNow.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();

LocalDate localDate = Instant.ofEpochSecond(dateNow.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalDate();

LocalTime localTime = Instant.ofEpochSecond(dateNow.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalTime();
}

在上述示例中,首先將java.util.Date對象轉(zhuǎn)換為java.time.Instant,然后通過atZone(ZoneId.systemDefault())方法將其轉(zhuǎn)換為特定時區(qū)(這里是系統(tǒng)默認(rèn)時區(qū))的ZonedDateTime對象。由于LocalDate、LocalTime和LocalDateTime都是時區(qū)無關(guān)的(對于LocalDateTime來說,它實際上是“本地”的,不包含時區(qū)信息,但在這里通過指定時區(qū)來從Instant獲取它),最后通過調(diào)用.toLocalDate()、.toLocalTime()或.toLocalDateTime()方法將它們從ZonedDateTime中提取出來。

注意,在轉(zhuǎn)換過程中,需要指定一個時區(qū),因為java.util.Date本身并不包含時區(qū)信息,它只是自epoch以來的毫秒數(shù)。因此,在轉(zhuǎn)換為LocalDate、LocalTime或LocalDateTime時,需要明確想要哪個時區(qū)的日期或時間。如果想要的是UTC時間,你可以使用ZoneId.of(“UTC”)代替ZoneId.systemDefault()。

LocalDateTime、LocalDate、LocalTime 轉(zhuǎn) Date

LocalDateTime localDateTime = LocalDateTime.now();
Date dateFromLocalDateTime = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

// 由于`LocalDate`不帶有時間信息,所以必須設(shè)置時間,才能轉(zhuǎn) Date。atStartOfDay,自動賦予午夜時間,返回 LocalDateTime,設(shè)置時區(qū)返回 ZonedDateTime,進(jìn)而得到 Instant
LocalDate localDate = LocalDate.now();
Date dateFromLocalDate = Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

// 由于`LocalDate`不帶有日期信息,所以必須設(shè)置日期,才能轉(zhuǎn) Date。
LocalTime localTime = LocalTime.now();
Date dateFromLocalTime = Date.from(localTime.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant());

LocalDateTime 和 String 互相轉(zhuǎn)換

LocalDateTime 轉(zhuǎn) String

LocalDate類有一個format()方法,可以將日期轉(zhuǎn)成字符串。format()方法需要一個DateTimeFormatter對象作為參數(shù)。

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr = LocalDateTime.now().format(dateTimeFormatter);

String 轉(zhuǎn) LocalDateTime

我們可以使用parse()方法從字符串中解析日期對象

String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr);

LocalDateTime 和 Instant 互相轉(zhuǎn)換

LocalDateTime表示沒有時區(qū)的日期時間,如2019-10-25T12:15:30,而Instant是時間線上的一個瞬時點。

LocalDateTime 轉(zhuǎn) Instant

LocalDateTime localDateTime = LocalDateTime.now();

Instant instant;
//第一種方式:Using LocalDateTime.toInstant()
instant = localDateTime.toInstant(ZoneOffset.UTC);

//第二種方式:Using LocalDateTime.atZone() and Instant.atZone()
instant =localDateTime.atZone(ZoneId.systemDefault()).toInstant();

//第三種方式:Using LocalDateTime.toEpochSecond() and Instant.ofEpochSecond()
long timeInSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC);
instant = Instant.ofEpochSecond(timeInSeconds);

Instant 轉(zhuǎn) LocalDateTime

//Using LocalDateTime.ofInstant
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());

long timeInSeconds = 1567109422L;
localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());

localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds, 0), ZoneId.systemDefault());

long timeInMillis = 1567109422123L;
localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timeInMillis), ZoneId.systemDefault());

//Using Timestamp
localDateTime = Timestamp.from(Instant.now()).toLocalDateTime(); 

Date 和 String 互相轉(zhuǎn)換

Date 轉(zhuǎn) String

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
String dateStr = df.format(now);

String 轉(zhuǎn) Date

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
String dateStr = df.format(now);
Date date = df.parse(dateStr);

總結(jié) 

到此這篇關(guān)于Java中各類日期和時間轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java Date和LocalDateTime相互轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot實現(xiàn)添加郵件發(fā)送及壓縮功能

    springboot實現(xiàn)添加郵件發(fā)送及壓縮功能

    這篇文章主要介紹了springboot實現(xiàn)添加郵件發(fā)送及壓縮功能 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • 基于Jmeter生成測試報告過程圖解

    基于Jmeter生成測試報告過程圖解

    這篇文章主要介紹了基于Jmeter生成測試報告過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Python如何使用@property @x.setter及@x.deleter

    Python如何使用@property @x.setter及@x.deleter

    這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • java 如何計算同比增長工具類

    java 如何計算同比增長工具類

    這篇文章主要介紹了java 如何計算同比增長工具類的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 使用SpringCache進(jìn)行緩存數(shù)據(jù)庫查詢方式

    使用SpringCache進(jìn)行緩存數(shù)據(jù)庫查詢方式

    這篇文章主要介紹了使用SpringCache進(jìn)行緩存數(shù)據(jù)庫查詢方式,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解

    Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解

    我在學(xué)習(xí)完順序表后一直對順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • springboot+websocket實現(xiàn)并發(fā)搶紅包功能

    springboot+websocket實現(xiàn)并發(fā)搶紅包功能

    本文主要介紹了springboot+websocket實現(xiàn)并發(fā)搶紅包功能,主要包含了4種步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • SpringMVC+Mybatis二維碼實現(xiàn)多平臺付款(附源碼)

    SpringMVC+Mybatis二維碼實現(xiàn)多平臺付款(附源碼)

    本文主要實現(xiàn)微信支付寶等支付平臺合多為一的二維碼支付,并且實現(xiàn)有效時間內(nèi)支付有效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解spring cloud config實現(xiàn)datasource的熱部署

    詳解spring cloud config實現(xiàn)datasource的熱部署

    這篇文章主要介紹了詳解spring cloud config實現(xiàn)datasource的熱部署,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • java隨機(jī)字符補(bǔ)充版

    java隨機(jī)字符補(bǔ)充版

    今天在zuidaimai看到一個java隨機(jī)字符生成demo,正好要用,但發(fā)現(xiàn)不完整,重新整理一下,分享給有需要的朋友
    2014-01-01

最新評論