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

從LocalDateTime到Instant詳解Java?8+中時(shí)間類型的使用

 更新時(shí)間:2026年05月09日 09:04:52   作者:暗暗別做白日夢  
本文介紹了Java?8引入的java.time時(shí)間API,主要包含四類核心時(shí)間類型,即無時(shí)區(qū)的本地時(shí)間,帶時(shí)區(qū)的時(shí)間,機(jī)器時(shí)間戳Instant和時(shí)間間隔,文章詳細(xì)說明了各類別的適用場景,希望對(duì)大家有所幫助

一、核心前置知識(shí)

1. 核心包

所有新時(shí)間類型都位于 java.time 包下,無需引入第三方依賴,JDK 8+ 原生支持。

2. 核心設(shè)計(jì)理念

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):將「日期、時(shí)間、時(shí)區(qū)、時(shí)間戳、時(shí)間間隔」嚴(yán)格拆分,每個(gè)類型只負(fù)責(zé)一件事,無歧義、無冗余。所有核心類都是:

  • 不可變類:修改時(shí)間會(huì)生成新對(duì)象,線程安全
  • 語義清晰:見名知意,沒有冗余方法
  • 時(shí)區(qū)安全:區(qū)分「本地時(shí)間」和「全球時(shí)間」

二、Java 8+ 常用時(shí)間類型全解

我們按照業(yè)務(wù)場景將核心類型分為 4 大類,逐一詳解:

第一類:無時(shí)區(qū)本地時(shí)間(純本地展示)

這類類型不包含任何時(shí)區(qū)信息,僅表示「人類視角的本地日期 / 時(shí)間」,比如生日、日程、本地鬧鐘,不適合存儲(chǔ)全球統(tǒng)一時(shí)間。

表格

類型含義格式示例核心特點(diǎn)
LocalDate僅日期(年月日)2025-12-25無時(shí)間、無時(shí)區(qū)
LocalTime僅時(shí)間(時(shí)分秒納秒)20:30:59.999無日期、無時(shí)區(qū)
LocalDateTime日期 + 時(shí)間2025-12-25T20:30:59無時(shí)區(qū),最常用本地類型
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class LocalTimeDemo {
    public static void main(String[] args) {
        // 1. 獲取當(dāng)前時(shí)間
        LocalDate today = LocalDate.now();
        LocalTime nowTime = LocalTime.now();
        LocalDateTime now = LocalDateTime.now();

        // 2. 手動(dòng)創(chuàng)建時(shí)間
        LocalDate birthDay = LocalDate.of(2000, 1, 1);
        LocalDateTime meeting = LocalDateTime.of(2025, 12, 25, 14, 30);

        // 3. 常用操作:加減時(shí)間(不可變,返回新對(duì)象)
        LocalDate nextWeek = today.plusWeeks(1);
        LocalDateTime beforeHour = now.minusHours(1);

        System.out.println("當(dāng)前日期:" + today);
        System.out.println("會(huì)議時(shí)間:" + meeting);
    }
}

適用場景

  • 生日、紀(jì)念日、本地日程
  • 前端展示的純本地時(shí)間
  • 與時(shí)區(qū)無關(guān)的業(yè)務(wù)場景

第二類:帶時(shí)區(qū) / 偏移量時(shí)間(全球業(yè)務(wù)專用)

這類類型包含時(shí)區(qū)信息,解決了「跨時(shí)區(qū)時(shí)間歧義」問題,是跨境業(yè)務(wù)、分布式系統(tǒng)的首選。

類型含義核心區(qū)別適用場景
OffsetDateTime日期 + 時(shí)間 + 時(shí)區(qū)偏移量僅記錄 +08:00 這類偏移量,輕量數(shù)據(jù)庫存儲(chǔ)、接口傳輸
ZonedDateTime日期 + 時(shí)間 + 完整時(shí)區(qū)記錄 Asia/Shanghai,支持夏令時(shí)時(shí)區(qū)轉(zhuǎn)換、復(fù)雜時(shí)區(qū)業(yè)務(wù)

關(guān)鍵區(qū)分

  • OffsetDateTime固定偏移量,無夏令時(shí)變化,數(shù)據(jù)庫官方推薦
  • ZonedDateTime完整時(shí)區(qū)規(guī)則,自動(dòng)處理夏令時(shí),適合復(fù)雜時(shí)區(qū)計(jì)算
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class ZoneTimeDemo {
    public static void main(String[] args) {
        // 1. 當(dāng)前帶偏移量的時(shí)間
        OffsetDateTime offsetNow = OffsetDateTime.now();

        // 2. 指定時(shí)區(qū)創(chuàng)建時(shí)間
        ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        ZonedDateTime newYorkTime = ZonedDateTime.now(ZoneId.of("America/New_York"));

        System.out.println("上海時(shí)間:" + shanghaiTime);
        System.out.println("紐約時(shí)間:" + newYorkTime);
    }
}

適用場景

  • 跨境電商、海外業(yè)務(wù)
  • 分布式系統(tǒng)的時(shí)間統(tǒng)一
  • 需要明確時(shí)區(qū)的業(yè)務(wù)邏輯

第三類:機(jī)器時(shí)間戳

Instant 是 Java 新時(shí)間 API 中最重要的類型,專為計(jì)算機(jī)存儲(chǔ)、計(jì)算設(shè)計(jì)。

核心特性

  • 表示 UTC 時(shí)區(qū)的時(shí)間戳(從 1970-01-01 00:00:00 開始的秒 / 納秒)
  • 無任何時(shí)區(qū)歧義,全球唯一
  • 不可變、線程安全、性能極高
import java.time.Instant;

public class InstantDemo {
    public static void main(String[] args) {
        // 1. 獲取當(dāng)前時(shí)間戳
        Instant now = Instant.now();

        // 2. 時(shí)間戳轉(zhuǎn)秒/毫秒(兼容舊系統(tǒng))
        long second = now.getEpochSecond();
        long milli = now.toEpochMilli();

        // 3. 手動(dòng)創(chuàng)建
        Instant instant = Instant.ofEpochMilli(System.currentTimeMillis());

        System.out.println("當(dāng)前UTC時(shí)間:" + now);
        System.out.println("時(shí)間戳(毫秒):" + milli);
    }
}

適用場景

數(shù)據(jù)庫存儲(chǔ)時(shí)間的最佳選擇

日志時(shí)間、分布式鎖超時(shí)、消息隊(duì)列時(shí)間戳

所有需要「全球統(tǒng)一、無歧義」的時(shí)間場景

第四類:時(shí)間間隔(計(jì)算時(shí)間差專用)

專門用于計(jì)算兩個(gè)時(shí)間的差值,嚴(yán)格拆分「日期間隔」和「時(shí)間間隔」:

類型含義計(jì)算單位
Period日期間隔年、月、日
Duration時(shí)間間隔時(shí)、分、秒、納秒
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;

public class TimeGapDemo {
    public static void main(String[] args) {
        // 1. 計(jì)算日期間隔(生日天數(shù))
        LocalDate today = LocalDate.now();
        LocalDate birthDay = LocalDate.of(2000, 1, 1);
        Period period = Period.between(birthDay, today);
        System.out.println("年齡:" + period.getYears() + "歲");

        // 2. 計(jì)算時(shí)間間隔(會(huì)議時(shí)長)
        LocalDateTime start = LocalDateTime.of(2025, 12, 25, 14, 0);
        LocalDateTime end = LocalDateTime.of(2025, 12, 25, 16, 30);
        Duration duration = Duration.between(start, end);
        System.out.println("會(huì)議時(shí)長:" + duration.toHours() + "小時(shí)");
    }
}

三、高頻實(shí)用操作:格式化與轉(zhuǎn)換

1. 時(shí)間格式化 / 解析(線程安全)

替代線程不安全的 SimpleDateFormat,使用 DateTimeFormatter

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class FormatDemo {
    public static void main(String[] args) {
        // 定義格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();

        // 時(shí)間 → 字符串
        String formatTime = now.format(formatter);

        // 字符串 → 時(shí)間
        LocalDateTime parseTime = LocalDateTime.parse("2025-12-25 14:30:00", formatter);

        System.out.println("格式化后:" + formatTime);
    }
}

2. 核心類型轉(zhuǎn)換

// LocalDateTime → Instant(帶時(shí)區(qū))
LocalDateTime local = LocalDateTime.now();
Instant instant = local.atZone(ZoneId.systemDefault()).toInstant();

// Instant → LocalDateTime
LocalDateTime localTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

四、開發(fā)避坑指南

禁止用 LocalDateTime 存儲(chǔ)全球時(shí)間無時(shí)區(qū),跨時(shí)區(qū)會(huì)出現(xiàn)時(shí)間錯(cuò)亂,存儲(chǔ)必須用 Instant/OffsetDateTime

禁止使用 SimpleDateFormat線程不安全,高并發(fā)下會(huì)出現(xiàn)格式化錯(cuò)誤,統(tǒng)一用 DateTimeFormatter。

Instant 是 UTC 時(shí)間直接打印會(huì)比北京時(shí)間晚 8 小時(shí),屬于正?,F(xiàn)象,轉(zhuǎn)換為本地時(shí)間即可。

所有新時(shí)間類都是不可變的調(diào)用 plus/minus 方法必須接收返回值,原對(duì)象不會(huì)改變。

五、企業(yè)級(jí)最佳實(shí)踐

業(yè)務(wù)場景推薦類型理由
數(shù)據(jù)庫存儲(chǔ)時(shí)間Instant / OffsetDateTime無歧義、跨時(shí)區(qū)兼容
本地展示(生日 / 日程)LocalDateTime無時(shí)區(qū),語義清晰
跨境 / 時(shí)區(qū)業(yè)務(wù)ZonedDateTime支持完整時(shí)區(qū)規(guī)則
時(shí)間戳 / 日志 / 超時(shí)Instant機(jī)器時(shí)間,性能最優(yōu)
計(jì)算日期差Period年月日間隔
計(jì)算時(shí)間差Duration時(shí)分秒間隔

六、總結(jié)

Java 8+ java.time 包的時(shí)間 API 是現(xiàn)代 Java 開發(fā)的標(biāo)準(zhǔn)工具,徹底告別了傳統(tǒng)時(shí)間類的痛點(diǎn):

  1. 分工明確:日期、時(shí)間、時(shí)區(qū)、時(shí)間戳各司其職;
  2. 線程安全:所有類不可變,高并發(fā)無壓力;
  3. 無歧義:解決了跨時(shí)區(qū)、時(shí)間格式化的所有坑;
  4. 易用性強(qiáng):API 語義清晰,一行代碼完成時(shí)間操作。

核心:存儲(chǔ)用 Instant,展示用 LocalDateTime,時(shí)區(qū)用 ZonedDateTime,計(jì)算用 Duration/Period。

到此這篇關(guān)于從LocalDateTime到Instant詳解Java 8+中時(shí)間類型的使用的文章就介紹到這了,更多相關(guān)Java 8時(shí)間類型使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)高級(jí)綜合練習(xí)題撲克牌的創(chuàng)建

    Java基礎(chǔ)高級(jí)綜合練習(xí)題撲克牌的創(chuàng)建

    今天小編就為大家分享一篇關(guān)于Java基礎(chǔ)高級(jí)綜合練習(xí)題撲克牌的創(chuàng)建,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Spring注解@Value及屬性加載配置文件方式

    Spring注解@Value及屬性加載配置文件方式

    這篇文章主要介紹了Spring注解@Value及屬性加載配置文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 深入理解Java集合框架如何構(gòu)建高效、靈活的數(shù)據(jù)管理方案

    深入理解Java集合框架如何構(gòu)建高效、靈活的數(shù)據(jù)管理方案

    Java集合框架是Java語言中一個(gè)非常重要且強(qiáng)大的部分,它提供了一套豐富、靈活且類型安全的集合數(shù)據(jù)結(jié)構(gòu),幫助開發(fā)者以統(tǒng)一和一致的方式處理數(shù)據(jù)集合,這篇文章主要介紹了深入理解Java集合框架:構(gòu)建高效、靈活的數(shù)據(jù)管理方案,需要的朋友可以參考下
    2025-03-03
  • Mybatis-Plus中的@TableName 和 table-prefix使用

    Mybatis-Plus中的@TableName 和 table-prefix使用

    table-prefix 是一個(gè)全局配置,它會(huì)自動(dòng)在所有表名前添加指定的前綴,這個(gè)配置對(duì)于那些使用一致命名約定的數(shù)據(jù)庫表非常有用,這篇文章主要介紹了Mybatis-Plus中的@TableName 和 table-prefix使用,需要的朋友可以參考下
    2024-08-08
  • jdk21下載、安裝詳細(xì)教程(Windows、Linux、macOS)

    jdk21下載、安裝詳細(xì)教程(Windows、Linux、macOS)

    本文介紹了OpenJDK 21的下載地址和安裝步驟,包括Windows、Linux和macOS平臺(tái),下載后解壓并設(shè)置環(huán)境變量,最后驗(yàn)證安裝,感興趣的朋友一起看看吧
    2025-03-03
  • Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程

    Centos6.5下Jdk+Tomcat+Mysql環(huán)境安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了Centos6.5系統(tǒng)下Jdk+Tomcat+Mysql環(huán)境安裝過程,感興趣的小伙伴們可以參考一下
    2016-05-05
  • SpringBoot集成Auth0 JWT的示例代碼

    SpringBoot集成Auth0 JWT的示例代碼

    本文主要介紹了SpringBoot集成Auth0 JWT的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Springboot項(xiàng)目如何異步提高接口的響應(yīng)速度

    Springboot項(xiàng)目如何異步提高接口的響應(yīng)速度

    這篇文章主要介紹了Springboot項(xiàng)目如何異步提高接口的響應(yīng)速度方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • java wagon如何打包文件到不同服務(wù)器

    java wagon如何打包文件到不同服務(wù)器

    這篇文章主要介紹了java wagon如何打包文件到不同服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Java實(shí)現(xiàn)批量修改txt文件名稱的方法示例

    Java實(shí)現(xiàn)批量修改txt文件名稱的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)批量修改txt文件名稱的方法,結(jié)合實(shí)例形式分析了Java針對(duì)目錄文件遍歷及文件讀寫、屬性操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03

最新評(píng)論

晋宁县| 滦南县| 辽阳县| 孟州市| 鄂温| 新营市| 漠河县| 临城县| 兴海县| 大同县| 阿克苏市| 锡林郭勒盟| 门头沟区| 奉化市| 临西县| 琼海市| 崇义县| 青河县| 遂宁市| 宁明县| 安远县| 洛隆县| 安塞县| 冀州市| 西峡县| 宜春市| 罗定市| 江安县| 东丰县| 湖北省| 府谷县| 葵青区| 定南县| 永兴县| 财经| 华阴市| 凤城市| 巴林左旗| 芜湖市| 昆山市| 林口县|