最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、前言

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

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

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

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

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

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

要將java.util.Date轉(zhuǎn)換為L(zhǎng)ocalDate、LocalTime或LocalDateTime,可以使用java.time.Instant類作為中間橋梁,因?yàn)镮nstant類可以表示時(shí)間線上的一個(gè)瞬時(shí)點(diǎn),與java.util.Date有相似的用途(盡管Instant是以UTC表示的,而Date是相對(duì)于默認(rèn)時(shí)區(qū)的)。

Java8 發(fā)行的時(shí)候,也考慮到了新舊 API 之間的轉(zhuǎn)換,所以在java.util.Date中增加了toInstance()方法,可以得到一個(gè)Instance實(shí)例。Instance表示時(shí)間線上的一個(gè)瞬時(shí)點(diǎn),沒(méi)有時(shí)區(qū)概念,所以我們需要通過(guò)atZone()指定時(shí)區(qū),得到ZonedDateTime實(shí)例,然后轉(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)建實(shí)例。如下:

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對(duì)象轉(zhuǎn)換為java.time.Instant,然后通過(guò)atZone(ZoneId.systemDefault())方法將其轉(zhuǎn)換為特定時(shí)區(qū)(這里是系統(tǒng)默認(rèn)時(shí)區(qū))的ZonedDateTime對(duì)象。由于LocalDate、LocalTime和LocalDateTime都是時(shí)區(qū)無(wú)關(guān)的(對(duì)于LocalDateTime來(lái)說(shuō),它實(shí)際上是“本地”的,不包含時(shí)區(qū)信息,但在這里通過(guò)指定時(shí)區(qū)來(lái)從Instant獲取它),最后通過(guò)調(diào)用.toLocalDate()、.toLocalTime()或.toLocalDateTime()方法將它們從ZonedDateTime中提取出來(lái)。

注意,在轉(zhuǎn)換過(guò)程中,需要指定一個(gè)時(shí)區(qū),因?yàn)閖ava.util.Date本身并不包含時(shí)區(qū)信息,它只是自epoch以來(lái)的毫秒數(shù)。因此,在轉(zhuǎn)換為L(zhǎng)ocalDate、LocalTime或LocalDateTime時(shí),需要明確想要哪個(gè)時(shí)區(qū)的日期或時(shí)間。如果想要的是UTC時(shí)間,你可以使用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í)間信息,所以必須設(shè)置時(shí)間,才能轉(zhuǎn) Date。atStartOfDay,自動(dòng)賦予午夜時(shí)間,返回 LocalDateTime,設(shè)置時(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類有一個(gè)format()方法,可以將日期轉(zhuǎn)成字符串。format()方法需要一個(gè)DateTimeFormatter對(duì)象作為參數(shù)。

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

String 轉(zhuǎn) LocalDateTime

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

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

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

LocalDateTime表示沒(méi)有時(shí)區(qū)的日期時(shí)間,如2019-10-25T12:15:30,而Instant是時(shí)間線上的一個(gè)瞬時(shí)點(diǎn)。

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

相關(guān)文章

  • 三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類

    三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類

    這篇文章主要介紹了三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springmvc實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)信息為excle表格示例代碼

    springmvc實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)信息為excle表格示例代碼

    本篇文章主要介紹了springmvc實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)信息為excle表格,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。
    2017-01-01
  • MyBatis源碼解析——獲取SqlSessionFactory方式

    MyBatis源碼解析——獲取SqlSessionFactory方式

    這篇文章主要介紹了MyBatis源碼解析——獲取SqlSessionFactory方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • swing重繪按鈕為任意形狀圖案的方法

    swing重繪按鈕為任意形狀圖案的方法

    這篇文章主要為大家詳細(xì)介紹了swing重繪按鈕為任意形狀圖案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java?超詳細(xì)帶你掌握矩陣的運(yùn)算

    Java?超詳細(xì)帶你掌握矩陣的運(yùn)算

    在學(xué)習(xí)機(jī)器學(xué)習(xí)算法時(shí),發(fā)現(xiàn)運(yùn)用java?來(lái)實(shí)現(xiàn)有些算法代碼時(shí),會(huì)有很大困難,其中有一點(diǎn)就是?java?本身并沒(méi)有矩陣運(yùn)算的?api,所以進(jìn)行要實(shí)現(xiàn)矩陣運(yùn)算就尤其復(fù)雜,讓我們一起了解矩陣的運(yùn)算
    2022-03-03
  • java自旋鎖和JVM對(duì)鎖的優(yōu)化詳解

    java自旋鎖和JVM對(duì)鎖的優(yōu)化詳解

    這篇文章主要為大家介紹了java自旋鎖和JVM對(duì)鎖的優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Mybatis復(fù)雜查詢的實(shí)現(xiàn)

    Mybatis復(fù)雜查詢的實(shí)現(xiàn)

    本文主要介紹了Mybatis復(fù)雜查詢的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java如何判斷一個(gè)整數(shù)有多少位

    Java如何判斷一個(gè)整數(shù)有多少位

    這篇文章主要介紹了Java如何判斷一個(gè)整數(shù)有多少位問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解Java的call by value和call by reference

    詳解Java的call by value和call by reference

    在本篇文章里小編給大家總結(jié)了關(guān)于Java的call by value和call by reference的相關(guān)用法和知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • java Swing布局管理之BoxLayout布局

    java Swing布局管理之BoxLayout布局

    這篇文章主要為大家詳細(xì)介紹了java Swing布局管理之BoxLayout布局的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評(píng)論

永安市| 泌阳县| 成武县| 包头市| 达日县| 南平市| 凤阳县| 仁化县| 齐齐哈尔市| 汾阳市| 右玉县| 民乐县| 滁州市| 名山县| 汉川市| 奉贤区| 卢氏县| 龙井市| 华坪县| 尚义县| 杭州市| 娱乐| 抚远县| 靖江市| 临朐县| 清水县| 宁阳县| 紫阳县| 三亚市| 谷城县| 宕昌县| 江北区| 河西区| 喀什市| 黔西县| 琼海市| 东乌| 共和县| 舒城县| 呈贡县| 凌云县|