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

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

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

一、核心前置知識

1. 核心包

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

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

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

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

二、Java 8+ 常用時間類型全解

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

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

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

表格

類型含義格式示例核心特點
LocalDate僅日期(年月日)2025-12-25無時間、無時區(qū)
LocalTime僅時間(時分秒納秒)20:30:59.999無日期、無時區(qū)
LocalDateTime日期 + 時間2025-12-25T20:30:59無時區(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)前時間
        LocalDate today = LocalDate.now();
        LocalTime nowTime = LocalTime.now();
        LocalDateTime now = LocalDateTime.now();

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

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

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

適用場景

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

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

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

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

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

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

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

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

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

適用場景

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

第三類:機器時間戳

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

核心特性

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

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

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

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

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

適用場景

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

日志時間、分布式鎖超時、消息隊列時間戳

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

第四類:時間間隔(計算時間差專用)

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

類型含義計算單位
Period日期間隔年、月、日
Duration時間間隔時、分、秒、納秒
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. 計算日期間隔(生日天數(shù))
        LocalDate today = LocalDate.now();
        LocalDate birthDay = LocalDate.of(2000, 1, 1);
        Period period = Period.between(birthDay, today);
        System.out.println("年齡:" + period.getYears() + "歲");

        // 2. 計算時間間隔(會議時長)
        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("會議時長:" + duration.toHours() + "小時");
    }
}

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

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

替代線程不安全的 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();

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

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

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

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

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

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

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

禁止用 LocalDateTime 存儲全球時間無時區(qū),跨時區(qū)會出現(xiàn)時間錯亂,存儲必須用 Instant/OffsetDateTime。

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

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

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

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

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

六、總結(jié)

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

    Java集合框架是Java語言中一個非常重要且強大的部分,它提供了一套豐富、靈活且類型安全的集合數(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 是一個全局配置,它會自動在所有表名前添加指定的前綴,這個配置對于那些使用一致命名約定的數(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平臺,下載后解壓并設(shè)置環(huá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ì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Springboot項目如何異步提高接口的響應(yīng)速度

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

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

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

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

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

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

最新評論

阿图什市| 孝昌县| 汝南县| 吴桥县| 吉水县| 天全县| 龙山县| 六安市| 依安县| 友谊县| 获嘉县| 海南省| 大同县| 庄浪县| 民勤县| 岳普湖县| 乌拉特后旗| 江津市| 万年县| 北票市| 甘德县| 宜川县| 剑河县| 射阳县| 南溪县| 绥滨县| 巴塘县| 宣化县| 合阳县| 湘潭市| 怀仁县| 巩义市| 建平县| 永州市| 哈巴河县| 米林县| 方正县| 潼南县| 中卫市| 获嘉县| 浦县|