Java中各類日期和時間轉(zhuǎn)換超詳析總結(jié)(Date和LocalDateTime相互轉(zhuǎn)換等)
一、前言
大家在開發(fā)過程中必不可少得和日期打交道,對接別的系統(tǒng)時,時間日期格式不一致,每次都要轉(zhuǎn)換!
從 Java1 到 Java8 將近 20 年,再加上 Java8 的普及時間、各種歷史 API 兼容過渡時間。我們很多時候需要在舊時間 API 與新時間 API 之間切換,并行使用?。。?br />每次寫完就忘記了,小編專門來整理一篇來詳細(xì)說一下他們轉(zhuǎn)換的方法,方便后面使用??!
在Java開發(fā)中,日期和時間的處理隨著JDK的迭代發(fā)展經(jīng)歷了幾個階段,從最初的java.util.Date
和java.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.Calendar
和java.util.GregorianCalendar
:Calendar是一個抽象類,提供了日期和時間的計算方法。GregorianCalendar
是Calendar
的一個具體實現(xiàn),用于處理公歷(格里高利歷)。java.time
包中的類:在Java 8及以上版本,推薦使用java.time
包中的類來處理日期和時間,因為它們設(shè)計更加合理且功能更加強(qiáng)大。主要類包括LocalDate
、LocalTime
、LocalDateTime
、ZonedDateTime
、Instant
、Duration
、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ā)送及壓縮功能 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07Python如何使用@property @x.setter及@x.deleter
這篇文章主要介紹了Python如何使用@property @x.setter及@x.deleter,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05使用SpringCache進(jìn)行緩存數(shù)據(jù)庫查詢方式
這篇文章主要介紹了使用SpringCache進(jìn)行緩存數(shù)據(jù)庫查詢方式,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
我在學(xué)習(xí)完順序表后一直對順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-09-09springboot+websocket實現(xiàn)并發(fā)搶紅包功能
本文主要介紹了springboot+websocket實現(xiàn)并發(fā)搶紅包功能,主要包含了4種步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12SpringMVC+Mybatis二維碼實現(xiàn)多平臺付款(附源碼)
本文主要實現(xiàn)微信支付寶等支付平臺合多為一的二維碼支付,并且實現(xiàn)有效時間內(nèi)支付有效,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08詳解spring cloud config實現(xiàn)datasource的熱部署
這篇文章主要介紹了詳解spring cloud config實現(xiàn)datasource的熱部署,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01