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

Java中時(shí)間處理API全解析(從JDK7到JDK8)

 更新時(shí)間:2025年07月24日 08:43:33   作者:鈕祜祿.愛(ài)因斯晨  
在 Java 開(kāi)發(fā)領(lǐng)域,時(shí)間處理是一項(xiàng)極為常見(jiàn)且關(guān)鍵的需求,本文圍繞 JDK7 與 JDK8 中的時(shí)間處理類(lèi),詳細(xì)梳理時(shí)間類(lèi)的使用與演進(jìn),希望對(duì)大家有所幫助

前言

在 Java 開(kāi)發(fā)領(lǐng)域,時(shí)間處理是一項(xiàng)極為常見(jiàn)且關(guān)鍵的需求。無(wú)論是記錄用戶(hù)的操作時(shí)間,還是實(shí)現(xiàn)定時(shí)任務(wù)等功能,都離不開(kāi)對(duì)時(shí)間 API 的靈活運(yùn)用。本文圍繞 JDK7 與 JDK8 中的時(shí)間處理類(lèi),結(jié)合學(xué)習(xí)內(nèi)容,詳細(xì)梳理Date、SimpleDateFormat、Calendar以及 JDK8 全新時(shí)間類(lèi)的使用與演進(jìn),助力開(kāi)發(fā)者掌握 Java 時(shí)間處理的核心要點(diǎn)。

一、JDK7 時(shí)間處理基石 ——Date 類(lèi)

(一)Date 類(lèi)基本功能

Date類(lèi)位于java.util包下,是 JDK7 中用于表示特定瞬間的時(shí)間類(lèi),其精度可達(dá)到毫秒級(jí)別。它的出現(xiàn),為 Java 處理時(shí)間提供了基礎(chǔ)能力。

創(chuàng)建Date對(duì)象的方式較為簡(jiǎn)單,通過(guò)無(wú)參構(gòu)造方法可以直接獲取當(dāng)前系統(tǒng)時(shí)間:

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

上述代碼的輸出結(jié)果類(lèi)似Thu Jul 23 10:00:00 CST 2025,能夠直觀地呈現(xiàn)當(dāng)下的時(shí)間信息。

(二)Date 類(lèi)的局限性

盡管Date類(lèi)能夠獲取和表示時(shí)間,但在實(shí)際開(kāi)發(fā)過(guò)程中,它的短板逐漸顯現(xiàn)出來(lái):

可讀性差:直接輸出的時(shí)間格式對(duì)于普通用戶(hù)而言不夠友好,難以快速理解其中包含的具體年月日時(shí)分秒信息。

操作不便捷:如果想要獲取年、月、日等單獨(dú)的時(shí)間字段,需要結(jié)合其他類(lèi)(如Calendar),無(wú)法直接從Date對(duì)象中簡(jiǎn)潔地提取,這無(wú)疑增加了時(shí)間處理的復(fù)雜度。

二、格式化時(shí)間好幫手 ——SimpleDateFormat 類(lèi)

(一)格式化與解析原理

SimpleDateFormat是java.text包下的一個(gè)類(lèi),它專(zhuān)門(mén)用于對(duì)Date類(lèi)進(jìn)行格式化(將Date對(duì)象轉(zhuǎn)換為指定格式的字符串)和解析(將符合格式的字符串轉(zhuǎn)換回Date對(duì)象)操作。通過(guò)自定義的模式字符串,SimpleDateFormat能夠靈活地控制時(shí)間的展示樣式。

(二)常用模式符號(hào)

掌握以下這些模式符號(hào),就能根據(jù)需求定制出所需的時(shí)間格式:

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

(三)格式化操作示例

將Date對(duì)象轉(zhuǎn)換為 “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 對(duì)象:" + date); 
        } catch (ParseException e) {
            e.printStackTrace(); 
        }
    }
}

運(yùn)行上述代碼后,時(shí)間會(huì)按照設(shè)定的格式輸出,例如2025-07-23 10:15:30,大大提升了時(shí)間的可讀性。

(四)解析操作示例

將符合格式的字符串轉(zhuǎn)換回Date對(duì)象:

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 對(duì)象:" + date); 
        } catch (ParseException e) {
            e.printStackTrace(); 
        }
    }
}

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

三、更靈活的時(shí)間操作工具 ——Calendar 類(lèi)

(一)Calendar 類(lèi)特點(diǎn)

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

(二)獲取 Calendar 實(shí)例

由于Calendar是抽象類(lèi),不能直接通過(guò)new關(guān)鍵字來(lái)創(chuàng)建實(shí)例,而是需要通過(guò)getInstance方法來(lái)獲?。?/p>

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

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

(三)常用方法及示例

獲取時(shí)間字段

int year = calendar.get(Calendar.YEAR); 
int month = calendar.get(Calendar.MONTH) + 1; // 月份從 0 開(kāi)始,需要加 1
int day = calendar.get(Calendar.DAY_OF_MONTH); 
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 采用24小時(shí)制
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
System.out.println("當(dāng)前時(shí)間:" + year + "年" + month + "月" + day + "日 " + hour + ":" + minute + ":" + second);

設(shè)置時(shí)間

calendar.set(Calendar.YEAR, 2026); 
calendar.set(Calendar.MONTH, Calendar.JANUARY); // 直接使用常量,更具語(yǔ)義性
calendar.set(Calendar.DAY_OF_MONTH, 1); 
// 也可以一次性設(shè)置多個(gè)字段
calendar.set(2026, Calendar.FEBRUARY, 14, 18, 30, 0); 

時(shí)間加減

calendar.add(Calendar.DAY_OF_MONTH, 7); // 將當(dāng)前時(shí)間加 7 天
calendar.add(Calendar.HOUR, -3); // 將當(dāng)前時(shí)間減 3 小時(shí)

這些操作使得時(shí)間調(diào)整變得靈活高效,能夠輕松實(shí)現(xiàn)諸如計(jì)算 “一周后的時(shí)間”“三小時(shí)前的時(shí)間” 等需求。

(四)與 Date 類(lèi)相互轉(zhuǎn)換

Date轉(zhuǎn)Calendar:calendar.setTime(date);

Calendar轉(zhuǎn)Date:Date date = calendar.getTime();

通過(guò)這種轉(zhuǎn)換方式,能夠在兩種時(shí)間表示形式之間進(jìn)行切換,以適配不同 API 的需求。

四、JDK8 時(shí)間類(lèi) —— 新時(shí)代的時(shí)間處理方案

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

(一)LocalDate、LocalTime、LocalDateTime

LocalDate:專(zhuān)注于處理日期(年、月、日),示例如下:

import java.time.LocalDate;
public class LocalDateDemo {
    public static void main(String[] args) {
        LocalDate nowDate = LocalDate.now(); 
        System.out.println("當(dāng)前日期:" + 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:用于處理時(shí)間(時(shí)、分、秒、納秒),其用法與LocalDate類(lèi)似,能夠獲取、設(shè)置、加減時(shí)間字段。

LocalDateTime:融合了日期和時(shí)間的信息,功能更為全面,例如:

import java.time.LocalDateTime;
public class LocalDateTimeDemo {
    public static void main(String[] args) {
        LocalDateTime nowDateTime = LocalDateTime.now(); 
        LocalDateTime 指定時(shí)間 = LocalDateTime.of(2025, 7, 23, 10, 30, 0); 
        // 支持豐富的時(shí)間調(diào)整,如調(diào)整到下一個(gè)周一、設(shè)置秒數(shù)等
        LocalDateTime 下周一 = nowDateTime.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); 
    }
}

(二)ZoneId 與 ZonedDateTime—— 時(shí)區(qū)處理

ZoneId:用于表示時(shí)區(qū),例如ZoneId.of("Asia/Shanghai")可以獲取上海時(shí)區(qū)。

ZonedDateTime:表示帶時(shí)區(qū)的時(shí)間,它結(jié)合了LocalDateTime和ZoneId,能夠解決跨時(shí)區(qū)時(shí)間處理的問(wèn)題:

import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZonedDateTimeDemo {
    public static void main(String[] args) {
        ZonedDateTime 上海時(shí)間 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); 
        ZonedDateTime 紐約時(shí)間 = ZonedDateTime.now(ZoneId.of("America/New_York")); 
        // 時(shí)區(qū)轉(zhuǎn)換
        ZonedDateTime 上海轉(zhuǎn)紐約 = 上海時(shí)間.withZoneSameInstant(ZoneId.of("America/New_York")); 
    }
}

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

DateTimeFormatter是 JDK8 中用于格式化和解析時(shí)間的類(lèi),它是線程安全的,可以替代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 時(shí)間類(lèi)對(duì)比與選擇

(一)對(duì)比

線程安全:JDK7 中的SimpleDateFormat是線程不安全的,而 JDK8 的時(shí)間類(lèi)都是線程安全的。

易用性:JDK8 時(shí)間類(lèi)的方法更加直觀、語(yǔ)義更清晰,例如LocalDate.plusDays比Calendar.add更容易理解。

設(shè)計(jì)合理性:JDK8 時(shí)間類(lèi)的職責(zé)單一(LocalDate負(fù)責(zé)處理日期、LocalTime負(fù)責(zé)處理時(shí)間),而 JDK7 的時(shí)間類(lèi)功能較為混雜。

(二)選擇建議

新開(kāi)發(fā)項(xiàng)目:優(yōu)先使用 JDK8 的時(shí)間類(lèi),以享受其簡(jiǎn)潔、安全的 API。

維護(hù)老項(xiàng)目:如果使用的是 JDK7 的時(shí)間類(lèi),要注意線程安全問(wèn)題(例如對(duì)SimpleDateFormat進(jìn)行加鎖或使用ThreadLocal);也可以逐步將其遷移到 JDK8 的時(shí)間類(lèi),以提升代碼質(zhì)量。

六、總結(jié)

從 JDK7 的Date、SimpleDateFormat、Calendar,到 JDK8 的全新時(shí)間 API,Java 的時(shí)間處理能力在不斷演進(jìn)。在學(xué)習(xí)過(guò)程中,要理解不同類(lèi)的適用場(chǎng)景,掌握核心方法,在實(shí)際開(kāi)發(fā)中根據(jù)需求靈活選擇合適的時(shí)間類(lèi)。JDK8 的時(shí)間類(lèi)代表了未來(lái)的發(fā)展趨勢(shì),值得深入學(xué)習(xí)和運(yùn)用,從而讓時(shí)間處理變得更加高效、簡(jiǎn)潔。隨著對(duì) Java 時(shí)間 API 的掌握愈發(fā)熟練,在處理日期時(shí)間相關(guān)需求時(shí),也能更加得心應(yīng)手,為構(gòu)建健壯、易維護(hù)的 Java 程序奠定堅(jiān)實(shí)的基礎(chǔ)。

到此這篇關(guān)于Java中時(shí)間處理API全解析(從JDK7到JDK8)的文章就介紹到這了,更多相關(guān)Java時(shí)間處理API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java均攤復(fù)雜度和防止復(fù)雜度的震蕩原理分析

    Java均攤復(fù)雜度和防止復(fù)雜度的震蕩原理分析

    這篇文章主要介紹了Java均攤復(fù)雜度和防止復(fù)雜度的震蕩,結(jié)合實(shí)例形式分析了Java均攤復(fù)雜度和防止復(fù)雜度的震蕩相關(guān)概念、原理、實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • Java中的自旋鎖與阻塞鎖詳解

    Java中的自旋鎖與阻塞鎖詳解

    這篇文章主要介紹了Java中的自旋鎖與阻塞鎖詳解,阻塞鎖是指當(dāng)線程嘗試獲取鎖失敗時(shí),線程進(jìn)入阻塞狀態(tài),直到接收信號(hào)后被喚醒,阻塞或者喚醒一個(gè)Java線程需要操作系統(tǒng)切換CPU?狀態(tài)來(lái)完成,這種狀態(tài)轉(zhuǎn)換?需要耗費(fèi)處理器時(shí)間,需要的朋友可以參考下
    2023-10-10
  • springboot驗(yàn)證碼的生成與驗(yàn)證的兩種方法

    springboot驗(yàn)證碼的生成與驗(yàn)證的兩種方法

    本文主要介紹了springboot驗(yàn)證碼的生成與驗(yàn)證的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • SpringBoot讀取資源目錄中JSON文件的方法實(shí)例

    SpringBoot讀取資源目錄中JSON文件的方法實(shí)例

    最近做項(xiàng)目遇到需要將json類(lèi)型的配置文件引用到項(xiàng)目中,已經(jīng)將讀取json文件的方法封裝成工具類(lèi),下面這篇文章主要給大家介紹了關(guān)于SpringBoot讀取資源目錄中JSON文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java實(shí)現(xiàn)將Excel轉(zhuǎn)為HTML的完整示例

    Java實(shí)現(xiàn)將Excel轉(zhuǎn)為HTML的完整示例

    在 Web 應(yīng)用開(kāi)發(fā)中,經(jīng)常需要將 Excel 報(bào)表以網(wǎng)頁(yè)形式展示,本文將介紹如何在 Java 中使用免費(fèi)庫(kù) Free Spire.XLS for Java 將 Excel 文件轉(zhuǎn)換為 HTML 格式,感興趣的小伙伴可以了解下
    2026-03-03
  • Spring中使用Async進(jìn)行異步功能開(kāi)發(fā)實(shí)戰(zhàn)示例(大文件上傳為例)

    Spring中使用Async進(jìn)行異步功能開(kāi)發(fā)實(shí)戰(zhàn)示例(大文件上傳為例)

    本文以大文件上傳為例,首先講解在未進(jìn)行程序異步化時(shí),程序的運(yùn)行機(jī)制和具體表現(xiàn),然后講解如何進(jìn)行異步化的改造,讓程序進(jìn)行異步執(zhí)行,通過(guò)本文不僅能讓你掌握如何進(jìn)行Event的事件開(kāi)發(fā),同時(shí)還能掌握在Spring中如何進(jìn)行異步開(kāi)發(fā),熟悉@Async的具體用法,感興趣的朋友一起看看吧
    2024-08-08
  • Spring Boot 中的 @PutMapping 注解原理及使用小結(jié)

    Spring Boot 中的 @PutMapping 注解原理及使用小結(jié)

    在本文中,我們介紹了 Spring Boot 中的 @PutMapping 注解,它可以將 HTTP PUT 請(qǐng)求映射到指定的處理方法上,我們還介紹了 @PutMapping 注解的原理以及如何在 Spring Boot 中使用它,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Spring 中jdbcTemplate 實(shí)現(xiàn)執(zhí)行多條sql語(yǔ)句示例

    Spring 中jdbcTemplate 實(shí)現(xiàn)執(zhí)行多條sql語(yǔ)句示例

    本篇文章主要介紹了Spring 中jdbcTemplate 實(shí)現(xiàn)執(zhí)行多條sql語(yǔ)句示例,可以對(duì)多個(gè)表執(zhí)行多個(gè)sql語(yǔ)句,有興趣的可以了解一下。
    2017-01-01
  • 詳解IDEA啟動(dòng)多個(gè)微服務(wù)的配置方法

    詳解IDEA啟動(dòng)多個(gè)微服務(wù)的配置方法

    這篇文章主要介紹了詳解IDEA啟動(dòng)多個(gè)微服務(wù)的配置方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 基于Eclipse 的JSP/Servlet的開(kāi)發(fā)環(huán)境的搭建(圖文)

    基于Eclipse 的JSP/Servlet的開(kāi)發(fā)環(huán)境的搭建(圖文)

    本文將會(huì)詳細(xì)地展示如何搭建JSP的開(kāi)發(fā)環(huán)境。本次教程使用的是最新版的Eclipse 2018-09編輯器和最新版的Apache Tomcat v9.0,步驟詳細(xì),內(nèi)容詳盡,適合零基礎(chǔ)學(xué)者作為學(xué)習(xí)參考
    2018-12-12

最新評(píng)論

塔河县| 波密县| 龙海市| 蒲城县| 仪征市| 嘉禾县| 徐闻县| 内江市| 乐业县| 赤壁市| 五常市| 苗栗县| 社旗县| 三明市| 吉水县| 自治县| 井研县| 纳雍县| 庐江县| 宜宾县| 理塘县| 德兴市| 贵溪市| 开原市| 岑溪市| 杭锦后旗| 翼城县| 锦屏县| 涪陵区| 通城县| 达拉特旗| 鄂托克前旗| 比如县| 乌鲁木齐县| 都兰县| 大石桥市| 温州市| 邵武市| 稻城县| 彰化市| 洪洞县|