Java 時間處理指南:從“踩坑”到“填坑”實戰

?

🔥「炎碼工坊」技術彈藥已裝填!
點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】

?

場景問題:訂單處理系統的時間計算

假設你正在開發一個電商訂單系統,需要解決以下問題:?

  • 用戶下單后,需在?2小時內?完成支付,超時自動取消訂單。?
  • 訂單完成后,需計算?從下單到完成的總耗時(精確到分鐘)。?
  • 系統需支持?全球用戶,顯示時間需根據用戶所在時區調整。

這些問題的核心在于:如何準確地表示、計算、格式化時間??


方案對比:新舊API的“生死對決”

方案一:傳統?Date?+?SimpleDateFormat(Java 7及以下)

//?示例:計算訂單超時時間(Java?7)??
Date?now?=?new?Date();??
Date?expireTime?=?new?Date(now.getTime()?+?2?*?60?*?60?*?1000);?//?手動加2小時毫秒值??SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss");??
String?formattedNow?=?sdf.format(now);?//?格式化時間??//?問題:線程安全風險!??
SimpleDateFormat?sdfShared?=?new?SimpleDateFormat("yyyy-MM-dd");??
//?多線程環境下并發調用?sdfShared.parse()?會導致數據混亂??

缺點:?

  1. 線程不安全SimpleDateFormat?是可變對象,多線程共享時需額外加鎖。?
  2. 易用性差:日期加減需手動計算毫秒值(如?2 * 60 * 60 * 1000)。?
  3. 時區處理復雜:需顯式傳遞?TimeZone?對象,代碼冗余。

方案二:現代?java.time?API(Java 8+)

//?示例:訂單超時時間計算(Java?8+)??
LocalDateTime?now?=?LocalDateTime.now();??
LocalDateTime?expireTime?=?now.plusHours(2);?//?直接加2小時??DateTimeFormatter?formatter?=?DateTimeFormatter.ofPattern("yyyy-MM-dd?HH:mm:ss");??
String?formattedNow?=?now.format(formatter);?//?線程安全??//?計算耗時(如訂單完成時間?-?下單時間)??
LocalDateTime?orderTime?=?LocalDateTime.of(2025,?6,?17,?10,?0);??
LocalDateTime?completeTime?=?LocalDateTime.of(2025,?6,?17,?12,?30);??
long?minutes?=?Duration.between(orderTime,?completeTime).toMinutes();?//?150分鐘??//?時區支持:上海用戶看到的時間??
ZonedDateTime?shanghaiTime?=?ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));??

優點:?

  1. 線程安全:所有類均為不可變對象(如?DateTimeFormatter?可全局復用)。?
  2. 語義明確:直接調用?plusHours(2),無需手動計算毫秒。?
  3. 時區一體化ZonedDateTime?內置時區支持。

可視化流程:時間處理的“三步走”

?

核心類速查表(Java 8+)

類名全稱/用途說明典型場景
LocalDate僅表示日期(年-月-日)生日、節假日
LocalTime僅表示時間(時:分:秒)每日定時任務
LocalDateTime日期+時間(無時區)數據庫存儲、本地時間計算
ZonedDateTime帶時區的完整時間國際化時間展示
Duration時間段(精確到秒或納秒)計算兩個時間點的差值
Period日期段(精確到年、月、日)計算兩個日期相差的年/月/日
DateTimeFormatter線程安全的日期格式化工具時間與字符串的互相轉換

實戰代碼:常見操作模板

//?1.?獲取當前時間??
LocalDateTime?now?=?LocalDateTime.now();??//?2.?格式化輸出(如?"2025-06-17?15:30:00")??
DateTimeFormatter?formatter?=?DateTimeFormatter.ofPattern("yyyy-MM-dd?HH:mm:ss");??
String?formatted?=?now.format(formatter);??//?3.?解析字符串為時間??
String?input?=?"2025-06-17?15:30:00";??
LocalDateTime?parsed?=?LocalDateTime.parse(input,?formatter);??//?4.?日期計算(加減)??
LocalDate?today?=?LocalDate.now();??
LocalDate?tomorrow?=?today.plusDays(1);??
LocalDate?nextMonth?=?today.plusMonths(1);??//?5.?時區轉換??
ZonedDateTime?utcTime?=?ZonedDateTime.now(ZoneId.of("UTC"));??
ZonedDateTime?nyTime?=?utcTime.withZoneSameInstant(ZoneId.of("America/New_York"));??

最佳實踐總結

  1. 優先使用?java.time:避免舊版API的線程安全問題和復雜計算邏輯。?
  2. 復用?DateTimeFormatter:因其線程安全,建議定義為靜態常量。?
  3. 時區處理用?ZonedDateTime:避免手動調整時差,直接依賴時區ID(如?"Asia/Shanghai")。?
  4. 避免在循環中創建對象:如?LocalDateTime.now()?頻繁調用可能影響性能。

術語表

術語解釋
時間戳(Timestamp)自1970-01-01 00:00:00 UTC到現在的毫秒數,用于計算機內部時間表示。
時區(Time Zone)表示地球某一區域的本地時間,如?Asia/Shanghai代表中國標準時間(UTC+8)。
不可變對象(Immutable)創建后狀態不可修改的對象,天然線程安全,如?LocalDate
線程安全(Thread-safe)多線程環境下無需額外同步即可安全使用的代碼。

從“踩坑”到“填坑”:Java 8 的?java.timeAPI 通過清晰的設計和強大的功能,徹底解決了舊版時間類的痛點。無論是計算、格式化還是國際化,新API都能以更簡潔的方式完成任務。對于新項目,永遠不要再使用?Date?和?SimpleDateFormat

?


🚧 您已閱讀完全文99%!缺少1%的關鍵操作:
加入「炎碼燃料倉」🚀 獲得:
√ 開源工具紅黑榜
√ 項目落地避坑指南
√ 每周BUG修復進度+1%彩蛋
(溫馨提示:本工坊不打灰工,只燒腦洞🔥)?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85094.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Java的Excel列數據提取工具實現

摘要:本文介紹了一個使用Java語言開發的Excel列數據提取工具,該工具借助Apache POI庫實現對Excel文件的讀取與特定列數據提取功能。通過用戶輸入文件路徑與列名,程序可從指定Excel文件中提取相應列的數據并展示,同時詳細闡述了關鍵…

關于人工智能未來的趨勢

學而不思則罔 翻譯:使用深度學習、強化學習卻不用專家系統,就會產生幻覺。 思而不學則殆 翻譯:只有專家系統邏輯推理,但是不用大模型更新知識,就無法發展下去了。 因此,未來智能的范式應該是: …

Java八股文——MySQL「性能調優篇」

MySQL的EXPLAIN有什么作用? 面試官您好,EXPLAIN命令是我在進行SQL性能優化時,使用最頻繁、也最重要的一個工具。 它的核心作用可以一句話概括:模擬MySQL的查詢優化器來執行一條SQL語句,并向我們展示出它最終決定采用…

win打印機共享處理

win打印機共享處理 軟件鏈接 無法啟動Print Spooler服務錯誤193:0xc1的解決方案主要涉及修復服務依賴關系、清理打印緩存及修復系統文件?。該錯誤通常由系統文件損壞、注冊表配置異常或依賴服務未啟動導致,可通過以下步驟系統化解決。?? 解決方法:替換…

C++ map代碼練習 1、2、priority_queue基礎概念、對象創建、數據插入、獲取堆頂、出隊操作、大小操作,自定義結構、代碼練習 1 2

map代碼練習1&#xff0c;對應力扣 兩個數據的交集&#xff0c;代碼見下 class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {map<int, int> cnt;vector<int> ans;for(int i0; i<nums1.size(…

三天沖刺《編譯原理》——筆記(一)

點關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 持續關注我~~~主頁&#xff0c;查看更多內容喲&#xff08;希望你能在這里有所收獲&#x1f92d;&#xff09;。點關注&#xff0c;不迷路&#xf…

代理模式Proxy Pattern

模式定義 給某一個對象提供一個代理&#xff0c;并由代理對象控制對原對象的引用 對象結構型模式 模式結構 Subject&#xff1a;抽象主題角色Proxy&#xff1a;代理主題角色RealSubject&#xff1a;真實主題角色 代理類實現代碼 public class Proxy implements Subject {p…

基于YOLOv11與單目測距的實戰教程:從目標檢測到距離估算

引言 在計算機視覺領域&#xff0c;目標檢測與距離估算的結合是自動駕駛、機器人導航等場景的關鍵技術。本文將以YOLOv8模型為核心&#xff0c;結合單目相機的幾何模型&#xff0c;實現對視頻中目標的實時檢測與距離估算。代碼參考自單目測距原理博客&#xff0c;并通過實踐驗…

代碼生成器使用原理以及使用方法

代碼生成器使用原理以及使用方法 版本號&#xff1a;1.0 二Ο二五年二月 目錄 文檔介紹 1.1編寫目的 1.2文檔范圍 1.3讀者對象 系統設計 2.1設計目標 2.2設計思路 2.3代碼實現原理 使用方法 3.1如何使用 3.2如何修改&#xff1f; 對原程序的bug修改及簡…

STM32標準庫-I2C通信

文章目錄 一、I2C通信1.1 I2C1.2硬件電路1.3I2C時序基本單元1.4I2C時序 二、MPU60502.1簡介2.2MPU6050參數2.3硬件電路2.4MPU6050框圖 三、I2C外設(硬件)3.1簡介3.2I2C框圖3.3I2C基本結構3.4主機發送3.5主機接收3.6軟件/硬件波形對比1. 時序精度2. 信號穩定性3. 速率與效率4. 波…

使用 Azure LLM Functions 與 Elasticsearch 構建更智能的查詢體驗

作者&#xff1a;來自 Elastic Jonathan Simon 及 James Williams 試用這個示例房地產搜索應用&#xff0c;它結合了 Azure Gen AI LLM Functions 與 Elasticsearch&#xff0c;提供靈活的混合搜索結果。在 GitHub Codespaces 中查看逐步配置和運行該示例應用的方法。 更多閱讀…

模糊查詢 的深度技術解析

以下是 模糊查詢 的深度技術解析&#xff0c;涵蓋核心語法、通配符策略、性能優化及實戰陷阱&#xff1a; &#x1f50d; 一、核心運算符&#xff1a;LIKE SELECT * FROM 表名 WHERE 列名 LIKE 模式字符串;&#x1f3af; 二、通配符詳解 通配符作用示例匹配案例%任意長度字符…

[論文閱讀] (39)EuroSP25 CTINEXUS:基于大模型的威脅情報知識圖譜自動構建

《娜璋帶你讀論文》系列主要是督促自己閱讀優秀論文及聽取學術講座&#xff0c;并分享給大家&#xff0c;希望您喜歡。由于作者的英文水平和學術能力不高&#xff0c;需要不斷提升&#xff0c;所以還請大家批評指正&#xff0c;非常歡迎大家給我留言評論&#xff0c;學術路上期…

強化學習三大分類

核心目標&#xff1a; 教會一個智能體&#xff08;比如機器人、游戲AI、推薦系統&#xff09;通過試錯和獎勵&#xff0c;學會在某個環境中完成特定任務的最佳策略。 核心角色&#xff1a; 智能體 (Agent)&#xff1a; 學習者&#xff0c;比如玩游戲的小人、控制溫度的空調系…

城市排水生命線安全運行監測項目

近年來&#xff0c;城市內澇、污水溢流等問題頻發&#xff0c;讓排水管網這一"城市生命線"的安全運行備受關注。如何讓地下的"毛細血管"更智能、更可靠&#xff1f;本文將帶您深入解析城市排水生命線安全運行監測項目的建設邏輯與技術內核&#xff0c;看科…

LeetCode - 34. 在排序數組中查找元素的第一個和最后一個位置

題目 34. 在排序數組中查找元素的第一個和最后一個位置 - 力扣&#xff08;LeetCode&#xff09; 思路 查找左邊界 初始化 left 0, right nums.size() - 1 當 left < right 時循環&#xff1a; 計算中點 mid left (right - left) / 2 如果 nums[mid] < target…

Tesollo四指靈巧手DG-4F:18自由度與多種抓取模式結合實現高精度操作

Tesollo四指靈巧手 DG-4F 是一款具備 18 自由度的多模態末端執行器&#xff0c;采用模塊化結構設計&#xff0c;融合人手靈活性與夾爪高效性特點。該產品兼容 Universal Robots、Techman、Doosan Robotics、Rainbow Robotics 等主流機器人平臺&#xff0c;適用于工業自動化、科…

深入淺出JavaScript 原型鏈:對象繼承的“隱形鏈條”

深入淺出JavaScript 原型鏈&#xff1a;對象繼承的“隱形鏈條” 在 JavaScript 的世界里&#xff0c;原型鏈&#xff08;Prototype Chain&#xff09;是一個核心概念。它如同一條隱形的鏈條&#xff0c;連接著所有對象&#xff0c;使得代碼能夠高效地共享屬性和方法。理解原型…

LINUX中MYSQL的使用

LINUX中MYSQL的使用 MYSQL的數據類型 bool&#xff1a; 布爾類型 0 或者 1 CHAR&#xff1a; 單字符的字符 CHAR&#xff08;n&#xff09;:多字節字符 VARCHAR&#xff08;n&#xff09;&#xff1a;可變長度的字符型 TINYINT &#xff1a; 單字節整型 SMALLINT&#x…

打卡第48天:隨機函數與廣播機制

知識點回顧&#xff1a; 隨機張量的生成&#xff1a;torch.randn函數卷積和池化的計算公式&#xff08;可以不掌握&#xff0c;會自動計算的&#xff09;pytorch的廣播機制&#xff1a;加法和乘法的廣播機制 ps&#xff1a;numpy運算也有類似的廣播機制&#xff0c;基本一致 …