Java 時間處理 API 全解析:從 JDK7 到 JDK8 的演進

個人主頁-愛因斯晨

友友們,互三咯~

目錄

個人主頁-愛因斯晨

?編輯

前言

一、JDK7 時間處理基石 ——Date 類

(一)Date 類基本功能

(二)Date 類的局限性

二、格式化時間好幫手 ——SimpleDateFormat 類

(一)格式化與解析原理

(二)常用模式符號

(三)格式化操作示例

(四)解析操作示例

三、更靈活的時間操作工具 ——Calendar 類

(一)Calendar 類特點

(二)獲取 Calendar 實例

(三)常用方法及示例

(四)與 Date 類相互轉換

四、JDK8 時間類 —— 新時代的時間處理方案

(一)LocalDate、LocalTime、LocalDateTime

(二)ZoneId 與 ZonedDateTime—— 時區處理

(三)DateTimeFormatter—— 線程安全的格式化工具

五、JDK7 與 JDK8 時間類對比與選擇

(一)對比

(二)選擇建議

六、總結


?

前言

在 Java 開發領域,時間處理是一項極為常見且關鍵的需求。無論是記錄用戶的操作時間,還是實現定時任務等功能,都離不開對時間 API 的靈活運用。本文圍繞 JDK7 與 JDK8 中的時間處理類,結合學習內容,詳細梳理Date、SimpleDateFormat、Calendar以及 JDK8 全新時間類的使用與演進,助力開發者掌握 Java 時間處理的核心要點。

一、JDK7 時間處理基石 ——Date 類

(一)Date 類基本功能

Date類位于java.util包下,是 JDK7 中用于表示特定瞬間的時間類,其精度可達到毫秒級別。它的出現,為 Java 處理時間提供了基礎能力。

創建Date對象的方式較為簡單,通過無參構造方法可以直接獲取當前系統時間:

import java.util.Date;
public class DateDemo {public static void main(String[] args) {Date now = new Date();System.out.println("當前系統時間:" + now); }
}

上述代碼的輸出結果類似Thu Jul 23 10:00:00 CST 2025,能夠直觀地呈現當下的時間信息。

(二)Date 類的局限性

盡管Date類能夠獲取和表示時間,但在實際開發過程中,它的短板逐漸顯現出來:

  • 可讀性差:直接輸出的時間格式對于普通用戶而言不夠友好,難以快速理解其中包含的具體年月日時分秒信息。
  • 操作不便捷:如果想要獲取年、月、日等單獨的時間字段,需要結合其他類(如Calendar),無法直接從Date對象中簡潔地提取,這無疑增加了時間處理的復雜度。

二、格式化時間好幫手 ——SimpleDateFormat 類

(一)格式化與解析原理

SimpleDateFormat是java.text包下的一個類,它專門用于對Date類進行格式化(將Date對象轉換為指定格式的字符串)和解析(將符合格式的字符串轉換回Date對象)操作。通過自定義的模式字符串,SimpleDateFormat能夠靈活地控制時間的展示樣式。

(二)常用模式符號

掌握以下這些模式符號,就能根據需求定制出所需的時間格式:

  • y:表示年(例如yyyy表示四位年,yy表示兩位年)
  • M:表示月(MM會補兩位,1 月會顯示為01)
  • d:表示日(dd會補兩位)
  • H:表示時(采用 24 小時制,HH會補兩位)
  • m:表示分(mm會補兩位)
  • s:表示秒(ss會補兩位)

(三)格式化操作示例

將Date對象轉換為 “yyyy - MM - dd HH:mm:ss” 格式的字符串:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatParseDemo {public static void main(String[] args) {String timeStr = "2025-07-23 10:20:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {Date date = sdf.parse(timeStr);System.out.println("解析后的 Date 對象:" + date); } catch (ParseException e) {e.printStackTrace(); }}
}

運行上述代碼后,時間會按照設定的格式輸出,例如2025-07-23 10:15:30,大大提升了時間的可讀性。

(四)解析操作示例

將符合格式的字符串轉換回Date對象:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatParseDemo {public static void main(String[] args) {String timeStr = "2025-07-23 10:20:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {Date date = sdf.parse(timeStr);System.out.println("解析后的 Date 對象:" + date); } catch (ParseException e) {e.printStackTrace(); }}
}

需要注意的是,在進行解析操作時,字符串的格式必須和模式嚴格匹配,否則會拋出ParseException異常,因此要做好異常處理工作。

三、更靈活的時間操作工具 ——Calendar 類

(一)Calendar 類特點

Calendar是java.util包下的一個抽象類,與Date類相比,它提供了更為豐富的時間操作方法,能夠方便地獲取、設置時間字段(如年、月、日、時等),還支持對時間進行加減運算。

(二)獲取 Calendar 實例

由于Calendar是抽象類,不能直接通過new關鍵字來創建實例,而是需要通過getInstance方法來獲取:

import java.util.Calendar;
public class CalendarDemo {public static void main(String[] args) {Calendar calendar = Calendar.getInstance(); }
}

該方法返回的是GregorianCalendar實例(即公歷),能夠適配大部分的使用場景。

(三)常用方法及示例

  • 獲取時間字段
int year = calendar.get(Calendar.YEAR); 
int month = calendar.get(Calendar.MONTH) + 1; // 月份從 0 開始,需要加 1
int day = calendar.get(Calendar.DAY_OF_MONTH); 
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 采用24小時制
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
System.out.println("當前時間:" + year + "年" + month + "月" + day + "日 " + hour + ":" + minute + ":" + second);
  • 設置時間
calendar.set(Calendar.YEAR, 2026); 
calendar.set(Calendar.MONTH, Calendar.JANUARY); // 直接使用常量,更具語義性
calendar.set(Calendar.DAY_OF_MONTH, 1); 
// 也可以一次性設置多個字段
calendar.set(2026, Calendar.FEBRUARY, 14, 18, 30, 0); 
  • 時間加減
calendar.add(Calendar.DAY_OF_MONTH, 7); // 將當前時間加 7 天
calendar.add(Calendar.HOUR, -3); // 將當前時間減 3 小時

這些操作使得時間調整變得靈活高效,能夠輕松實現諸如計算 “一周后的時間”“三小時前的時間” 等需求。

(四)與 Date 類相互轉換

  • Date轉Calendar:calendar.setTime(date);
  • Calendar轉Date:Date date = calendar.getTime();

通過這種轉換方式,能夠在兩種時間表示形式之間進行切換,以適配不同 API 的需求。

四、JDK8 時間類 —— 新時代的時間處理方案

JDK8 引入了全新的時間 API(位于java.time包下),解決了 JDK7 時間類存在的諸多痛點,如線程不安全、設計復雜等問題,以下是其中的核心類介紹:

(一)LocalDate、LocalTime、LocalDateTime

  • LocalDate:專注于處理日期(年、月、日),示例如下:
import java.time.LocalDate;
public class LocalDateDemo {public static void main(String[] args) {LocalDate nowDate = LocalDate.now(); System.out.println("當前日期:" + nowDate); LocalDate 指定日期 = LocalDate.of(2025, 7, 23); int year = 指定日期.getYear(); int month = 指定日期.getMonthValue(); int day = 指定日期.getDayOfMonth(); LocalDate 加 5 天 = 指定日期.plusDays(5); LocalDate 減 3 月 = 指定日期.minusMonths(3); }
}
  • LocalTime:用于處理時間(時、分、秒、納秒),其用法與LocalDate類似,能夠獲取、設置、加減時間字段。
  • LocalDateTime:融合了日期和時間的信息,功能更為全面,例如:
import java.time.LocalDateTime;
public class LocalDateTimeDemo {public static void main(String[] args) {LocalDateTime nowDateTime = LocalDateTime.now(); LocalDateTime 指定時間 = LocalDateTime.of(2025, 7, 23, 10, 30, 0); // 支持豐富的時間調整,如調整到下一個周一、設置秒數等LocalDateTime 下周一 = nowDateTime.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); }
}

(二)ZoneId 與 ZonedDateTime—— 時區處理

  • ZoneId:用于表示時區,例如ZoneId.of("Asia/Shanghai")可以獲取上海時區。
  • ZonedDateTime:表示帶時區的時間,它結合了LocalDateTime和ZoneId,能夠解決跨時區時間處理的問題:
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZonedDateTimeDemo {public static void main(String[] args) {ZonedDateTime 上海時間 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); ZonedDateTime 紐約時間 = ZonedDateTime.now(ZoneId.of("America/New_York")); // 時區轉換ZonedDateTime 上海轉紐約 = 上海時間.withZoneSameInstant(ZoneId.of("America/New_York")); }
}

(三)DateTimeFormatter—— 線程安全的格式化工具

DateTimeFormatter是 JDK8 中用于格式化和解析時間的類,它是線程安全的,可以替代SimpleDateFormat。示例如下:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterDemo {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formatStr = now.format(formatter); System.out.println("格式化后:" + formatStr); LocalDateTime parseTime = LocalDateTime.parse("2025-07-23 10:45:00", formatter); }
}

五、JDK7 與 JDK8 時間類對比與選擇

(一)對比

  • 線程安全:JDK7 中的SimpleDateFormat是線程不安全的,而 JDK8 的時間類都是線程安全的。
  • 易用性:JDK8 時間類的方法更加直觀、語義更清晰,例如LocalDate.plusDays比Calendar.add更容易理解。
  • 設計合理性:JDK8 時間類的職責單一(LocalDate負責處理日期、LocalTime負責處理時間),而 JDK7 的時間類功能較為混雜。

(二)選擇建議

  • 新開發項目:優先使用 JDK8 的時間類,以享受其簡潔、安全的 API。
  • 維護老項目:如果使用的是 JDK7 的時間類,要注意線程安全問題(例如對SimpleDateFormat進行加鎖或使用ThreadLocal);也可以逐步將其遷移到 JDK8 的時間類,以提升代碼質量。

六、總結

從 JDK7 的Date、SimpleDateFormat、Calendar,到 JDK8 的全新時間 API,Java 的時間處理能力在不斷演進。在學習過程中,要理解不同類的適用場景,掌握核心方法,在實際開發中根據需求靈活選擇合適的時間類。JDK8 的時間類代表了未來的發展趨勢,值得深入學習和運用,從而讓時間處理變得更加高效、簡潔。隨著對 Java 時間 API 的掌握愈發熟練,在處理日期時間相關需求時,也能更加得心應手,為構建健壯、易維護的 Java 程序奠定堅實的基礎。

?

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

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

相關文章

duiLib 實現鼠標拖動標題欄時,窗口跟著拖動

1、布局文件,窗口需設置可拖動的標題欄區域:2、HandleMessage函數中,處理WM_LBUTTONDOWN消息,判斷鼠標在標題欄,讓系統處理窗口移動。代碼片段如下:else if (uMsg WM_LBUTTONDOWN) {// 獲取鼠標點擊坐標PO…

圖解嵌入式硬件知識庫體系

構建一個嵌入式硬件知識庫體系需要涵蓋嵌入式系統設計、開發和應用的各個方面,內容全面且系統化,適合不同層次的用戶。本文是一個結構化的嵌入式硬件知識庫體系,包含主要內容模塊及其詳細說明。 @startmindmap * 嵌入式硬件知識庫體系 ** 1. 嵌入式系統基礎 *** 概述與定義 …

機器學習的特征工程(特征構造、特征選擇、特征轉換和特征提取)詳解

特征工程是機器學習中至關重要的一步,它直接影響模型的性能和泛化能力。特征構造、特征選擇、特征轉換和特征提取——構成了特征工程的核心流程。下面我來系統地梳理一下它們的定義、方法和應用場景: 整理 by Moshow鄭鍇https://zhengkai.blog.csdn.net/…

Force Dimension觸覺力反饋設備在外科手術機器人遙操作和訓練中的應用

觸覺力反饋設備通過傳感器-執行器-信號處理閉環系統,在外科手術機器人領域實現了從遠程手術操作到虛擬訓練的全流程革新。外科手術機器人外科醫生廣博的專業知識往往受限于他們的主要工具——手。機器人的精確度和靈活性遠遠超過人手。然而,目前機器人還…

【網絡與爬蟲 00】試讀

網絡爬蟲技術全棧指南:從入門到AI時代的數據采集革命 關鍵詞:網絡爬蟲、Python爬蟲、數據采集、反爬技術、分布式爬蟲、AI爬蟲、Scrapy框架、自動化數據提取、爬蟲架構設計 摘要:本專欄是最全面的網絡爬蟲技術指南,涵蓋從基礎框架…

[Chat-LangChain] 前端用戶界面 | 核心交互組件 | 會話流管理

鏈接:https://python.langchain.com/docs/tutorials/qa_chat_history/ Chat-LangChain技術棧 : LangChainLangGraphNext.jsWeaviate (向量存儲)OpenAI (嵌入模型) docs:chat-langchain Chat LangChain 是一個智能聊天機器人,專為解答Lang…

編寫和運行 Playbook

編寫和運行 Playbook Playbook 介紹 adhoc 命令可以作為一次性命令對一組主機運行一項簡單的任務。不過,若要真正發揮Ansible的能力,需要使用功能 playbook。 playbook 是一個文本文件,其中包含由一個或多個按特定順序運行的play組成的列表。…

uniapp手機端video標簽層級過高問題

當我們想以視頻作為背景時,其他dom通過定位顯示在視頻上方,h5頁面上調試發現可以正常使用,效果如下: 當放在手機上看,會發現,僅僅剩一個視頻,本應在視頻上層的元素不見了。 經過一番排查&#x…

【MyBatis批量更新實現】按照list傳入批量更新

學習目標&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 顯示數據、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通過VOFA顯示數據波形。 一、VOFA 下載 VOFA 是一款面向嵌入式開發的上位機軟件&#xff0c;專注于硬件數據實時可視化與調試。它通過高效協議&#xff08;如FireWater、JustFloat&#xff09;將原始字節流轉化為…

MySQL 插入數據提示字段超出范圍?一招解決 DECIMAL 類型踩坑

MySQL 插入數據提示字段超出范圍&#xff1f;一招解決 DECIMAL 類型踩坑 在日常數據庫操作中&#xff0c;我們經常會遇到各種字段類型相關的問題。今天就來聊聊一個常見的錯誤&#xff1a;插入數據時提示字段值超出范圍&#xff0c;以實際案例帶你搞懂 MySQL 中 DECIMAL 類型的…

一周學會Matplotlib3 Python 數據可視化-繪制誤差條形圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

JVM垃圾回收器

垃圾回收算法標記-復制缺點&#xff1a;內存利用率低&#xff0c;有一塊區域無法使用。標記-清除缺點&#xff1a;1. 效率問題 (如果需要標記的對象太多&#xff0c;效率不高)2. 空間問題&#xff08;標記清除后會產生大量不連續的碎片&#xff09;標記-整理分代收集根據對象存…

科研工具的一些注意事項

Origin Origin導入數據之后&#xff0c;可以考慮 [刪除數據連接器…] 導入數據之后&#xff0c;刪除數據連接&#xff0c;這樣當原來的文件移動之后&#xff0c;就不影響origin文件里面的數據。不然就會出現空白數據&#xff1a;當然&#xff0c;沒有數據了也可以加載出來&…

美國服務器環境下Windows容器工作負載智能彈性伸縮

在北美數據中心加速數字化轉型的今天&#xff0c;企業客戶日益重視Windows容器工作負載的智能化管理。本文將深入探討基于Azure Stack HCI&#xff08;混合云基礎設施&#xff09;的彈性伸縮方案如何突破傳統資源調度瓶頸&#xff0c;通過分析指標收集、策略配置、混合云聯動三…

歐姆龍CP系列以太網通訊實現上位機與觸摸屏監控

一、行業痛點在現代工業生產中&#xff0c;自動化生產線的控制系統的高效性與智能化程度對生產效率和產品質量有著至關重要的影響。然而&#xff0c;許多傳統工業生產線中使用的歐姆龍CP系列系列PLC以太網模塊&#xff0c;由于自身設計原因&#xff0c;并未配備以太網接口&…

【大語言模型 00】導讀

【大語言模型00】導讀&#xff1a;你的LLM全棧工程師進階之路關鍵詞&#xff1a;大語言模型、LLM、Transformer、深度學習、AI工程化、全棧開發、技術路線圖摘要&#xff1a;這是一份完整的大語言模型學習指南&#xff0c;涵蓋從數學基礎到商業落地的200篇深度文章。無論你是AI…

Business Magic

題目描述There are n stores located along a street, numbered from 1 to n from nearest to farthest. Last month, the storek had a net profit of rk . If rk is positive, it represents a profit of rk dollars; if rk is negative, it represents a loss of ?rk dolla…

在ubuntu系統上離線安裝jenkins的做法

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 1.安裝java環境和下載war包&#xff1a; Jenkins 依賴于 Java 環境&#xff08;OpenJDK 11 或更高版本&#xff09;&#xff1a; # 安裝OpenJDK 11和字體依賴 sudo dpkg -i openjdk-11-jre-headless_*.deb fontconfi…

圖像相似度算法匯總及Python實現

下面整理了一些圖像相似度算法&#xff0c;可根據不同的需求選擇不同的算法&#xff0c;對每種算法進行了簡單描述并給出Python實現&#xff1a; 1. 基于像素的算法&#xff1a; (1).MSE(Mean Squared Error)&#xff1a;均方誤差&#xff0c;通過計算兩幅圖像對應像素值差的平…