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

Java中日期的加減&String Date Calendar的相互轉(zhuǎn)換方式

 更新時(shí)間:2025年05月24日 10:05:16   作者:HintYrx  
這篇文章主要介紹了Java中日期的加減&String Date Calendar的相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

最近在 Java 中遇到這樣一個(gè)需求:對(duì)字符串日期加減數(shù)天,比如:

  • “20220815” 加 1 天變?yōu)?“20220816”
  • “20220901” 減 1 天變?yōu)?“20220831”
  • “20240228” 加 2 天變?yōu)?“20240301”

等等。不熟悉 API 的我愣了,于是經(jīng)學(xué)習(xí)整理出本文,希望能幫到讀者。本文會(huì)梳理 String Date Calendar 的基本用法及相互轉(zhuǎn)換。

基本思路

先說(shuō)實(shí)現(xiàn)對(duì)字符串加減數(shù)日的需求,需要這樣的方法:

String addDay(String str, int num)

但 Java 中沒(méi)有方法能直接把字符串看作日期并對(duì)其加減若干天,所以先把格式五花八門(mén)的 String 解析成唯一的、能夠代表一個(gè)時(shí)刻的 Date, 然后對(duì) Date 一番操作,加數(shù)天也好減數(shù)月也好,再按希望的格式轉(zhuǎn)回 String, 這就是基本思路。

而在這個(gè)過(guò)程中,涉及到 String Date Calendar 三種類型的對(duì)象的相互轉(zhuǎn)換。如下:

String →simple.parse(str)→

Date →calendar.setTime(date)→

Calendar →calendar.getTime()→

Date →simple.format(date)→

String

接下來(lái)是面向 0 基礎(chǔ)的逐步講解:

String ← Date

Java 中一個(gè) Date 類型對(duì)象可以表示一個(gè)瞬時(shí)時(shí)刻,最高精確到毫秒。

public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date.toString());    // Mon Aug 15 18:19:55 CST 2022
}

new Date() 能夠獲得一個(gè)表示當(dāng)前時(shí)刻的 Date 對(duì)象,直接輸出之即可。(本文會(huì)在非 String 類型對(duì)象輸出時(shí)加上 toString() 方法,便于理解)

如果不想輸出默認(rèn)字符串,可以借助:SimpleDateFormat 類自定義輸出字符串的格式

public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date.toString());    // Mon Aug 15 18:19:55 CST 2022
    
    SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd");
    System.out.println(f.format(date));     // 2022/08/15
}

public final String format(Date date) 方法能按照調(diào)用對(duì)象指定的格式返回一個(gè) date 存儲(chǔ)的時(shí)刻對(duì)應(yīng)的字符串。這里定義格式 “年/月/日” 并存儲(chǔ)在 f 對(duì)象中。

指定格式的方法如下表所示:

格式解釋舉例
yyyy2022
MM08
dd15
EMon
HH小時(shí)18
mm分鐘19
ss55

格式還有很多,比如說(shuō) M MM MMM 甚至分別表示 8 08 Aug, 所以很靈活。你甚至可以模仿默認(rèn)格式……

public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date.toString());    // Mon Aug 15 18:19:55 CST 2022

    SimpleDateFormat f2 = new SimpleDateFormat("E MMM d HH:mm:ss zz yyyy", Locale.ENGLISH);
    System.out.println(f2.format(date));    // Mon Aug 15 18:19:55 CST 2022
}

不過(guò)常用的就是上表的那些。

String → Date

若要解析 String → Date, 同樣可以借助 SimpleDateFormat, 用另一個(gè)方法:parse().

public static void main(String[] args) {
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(f.parse("2022-08-15").toString());
}

public Date parse(String source) 方法按照調(diào)用者指定的格式返回一個(gè)與字符串參數(shù)對(duì)應(yīng)時(shí)刻相同的 Date 類型的對(duì)象。

但要注意上面這樣是會(huì)報(bào)錯(cuò)的,因?yàn)榧僭O(shè)你將來(lái)沒(méi)有按照 2022-08-15 輸入,Java 應(yīng)拋出異常,用 try/catch 包圍代碼吧。

public static void main(String[] args) {
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
    try {
        System.out.println(f.parse("2022-08-15").toString());   // Mon Aug 15 00:00:00 CST 2022
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}

因?yàn)闆](méi)有指定時(shí)分秒,就按全為 0 輸出了。這不重要,重要的是我們確實(shí)成功得到了一個(gè) Date 類型對(duì)象。

如果格式不匹配會(huì)怎樣呢?如圖,拋出了 java.text.ParseException 異常。

public static void main(String[] args) {
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
    try {
        System.out.println(f.parse("20220815").toString());
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}

到此為止就實(shí)現(xiàn)了任意格式字符串與 Date 的互轉(zhuǎn)。

Date ↔ Calendar

得到一個(gè) Date 對(duì)象后,如何對(duì)其進(jìn)行加減?這需要抽象類 Calendar 的幫助。其實(shí) Calendar 能在許多場(chǎng)景替換 Date, 不過(guò)似乎卻不能不借助 Date 和 SimpleDateFormat 來(lái)與 String 轉(zhuǎn)換,所以先梳理了上文。

總之,Calendar 也可以表示一個(gè)瞬時(shí)時(shí)刻,不過(guò)不能像 Date 那樣直接輸出,需要先借助 getTime() 轉(zhuǎn)換為 Date.

public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date.toString());                // Mon Aug 15 18:19:55 CST 2022

    Calendar badExample = Calendar.getInstance();
    System.out.println(badExample.toString());          // java.util.GregorianCalendar[time=....非常長(zhǎng),后面省略

    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.getTime().toString());  // Mon Aug 15 18:19:55 CST 2022
}

因?yàn)槭浅橄箢悾越柚?public static Calendar getInstance() 方法得到一個(gè)表示當(dāng)前時(shí)刻的 Calendar 對(duì)象。

public final Date getTime() 方法可以直接返回一個(gè)表示此調(diào)用者存儲(chǔ)的時(shí)間值的 Date 對(duì)象。相似的,public final void setTime(Date date) 同理。沒(méi)錯(cuò),Date 和 Calendar 類互轉(zhuǎn)非常簡(jiǎn)單。

并且 Calendar 類是比較強(qiáng)大的,借助 public int get(int field) 方法可以返回指定時(shí)間字段的值,public void set(int field, int value) 方法可以設(shè)置指定時(shí)間字段的值。時(shí)間字段代表是年,還是月,還是日,使用 Calendar 的靜態(tài)成員變量即可。

舉例:

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();

    int year = calendar.get(Calendar.YEAR);         // 2022
    int month = calendar.get(Calendar.MONTH);       // 7
    int day = calendar.get(Calendar.DAY_OF_MONTH);  // 15
    calendar.set(Calendar.YEAR, 2333);              // 年份從 2022 變?yōu)?2333
}

注意:month ∈ [0, 11], 比人類習(xí)慣的 [1, 12] 少 1.

加減日期

截止目前已經(jīng)完成了 String Date Calendar 互轉(zhuǎn)了。(Calendar 到 String 恐怕只能通過(guò) Date 中轉(zhuǎn)一下,我沒(méi)有發(fā)現(xiàn)任何無(wú)需借助 Date 的方法)

接下來(lái)該實(shí)現(xiàn)按格式輸入字符串日期,任意加減天數(shù)的需求了,用到 Calendar 的成員方法:public abstract void add(int field, int amount).

它能在 field 代表的時(shí)間字段上加 amount 個(gè)單位(可以為負(fù)數(shù))。字段同樣使用 Calendar 的靜態(tài)成員變量。結(jié)合例子很容易理解:

public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    System.out.println(calendar.getTime().toString());  // Mon Aug 15 18:19:55 CST 2022

    calendar.add(Calendar.YEAR, 2);                     // Mon Aug 15 18:19:55 CST 2024
    calendar.add(Calendar.MONTH, -6);                   // Thu Feb 15 18:19:55 CST 2024
    calendar.add(Calendar.DAY_OF_MONTH, 14);            // Thu Feb 29 18:19:55 CST 2024

    System.out.println(calendar.getTime().toString());  // Thu Feb 29 18:19:55 CST 2024
}

最后,把上面的內(nèi)容連起來(lái),筆者終于完成了:按指定格式 “yyyyMMdd” 傳入字符串與加減天數(shù),返回同樣格式字符串的方法:String addDay(String str, int num). 如下:

public class Main {

    /**
     * 對(duì)日期加減數(shù)天
     *
     * @param yyyyMMdd 形如 "20240228"
     * @param day      形如 2(支持負(fù)數(shù))
     * @return 形如 "20240301"
     */
    public static String addDay(String yyyyMMdd, int day) {

        // String to Date
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Date date;
        try {
            date = format.parse(yyyyMMdd);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

        // Change Date
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, day);
        date = calendar.getTime();

        // Date to String
        yyyyMMdd = format.format(date);

        return yyyyMMdd;
    }

    public static void main(String[] args) {
        System.out.println(addDay("20240228", 2));  // 20240301
    }
}

即使天數(shù)很多也沒(méi)問(wèn)題:

System.out.println(addDay("20240228", 2333));  // 20300719

也可以完全同理實(shí)現(xiàn)加減年/月/時(shí)/分/秒,等等,只需更改 fieldCalendar.XXX 即可,不一而足。

總結(jié)

1、三者互轉(zhuǎn):

(SimpleDateFormat 對(duì)象和 Calendar 對(duì)象用 s c 簡(jiǎn)寫(xiě))

2、實(shí)現(xiàn)日期字符串的加減:

String → Date → Calendar → Date → String.

核心是對(duì) Calendar 對(duì)象使用 add() 方法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot開(kāi)啟Swagger并配置基本信息方式

    SpringBoot開(kāi)啟Swagger并配置基本信息方式

    這篇文章主要介紹了SpringBoot開(kāi)啟Swagger并配置基本信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java 抽象類和接口的區(qū)別詳細(xì)解析

    java 抽象類和接口的區(qū)別詳細(xì)解析

    abstractclass和interface是Java語(yǔ)言中對(duì)于抽象類定義進(jìn)行支持的兩種機(jī)制,正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰?需要了解的朋友可以參考下
    2012-11-11
  • java中JDeps命令使用

    java中JDeps命令使用

    jdeps是一個(gè)Java類依賴分析工具,用于分析Java應(yīng)用程序的依賴情況,包括類、包、模塊以及JDK內(nèi)部API的使用,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-09-09
  • Java并發(fā)之線程同步、死鎖、多線程編排全面解析

    Java并發(fā)之線程同步、死鎖、多線程編排全面解析

    本文系統(tǒng)講解了Java多線程同步機(jī)制、死鎖原理及解決方法,以及CompletableFuture實(shí)現(xiàn)異步編排的核心功能,涵蓋鎖類型、并發(fā)工具、資源管理策略等內(nèi)容,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Java中CopyOnWriteArrayList的使用解析

    Java中CopyOnWriteArrayList的使用解析

    這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫(xiě)操作的場(chǎng)景里,比如緩存,它不存在擴(kuò)容的概念,每次寫(xiě)操作都要復(fù)制一個(gè)副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下
    2023-12-12
  • springboot中使用undertow踩坑記(最新推薦)

    springboot中使用undertow踩坑記(最新推薦)

    這篇文章主要介紹了springboot中使用undertow踩坑記,springboot內(nèi)置類web中間件,將web服務(wù)器管理權(quán)交給了容器,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 修改request請(qǐng)求的header請(qǐng)求頭實(shí)現(xiàn)方式

    修改request請(qǐng)求的header請(qǐng)求頭實(shí)現(xiàn)方式

    本文介紹了在Spring Cloud Gateway中修改HTTP請(qǐng)求頭的方法,包括直接操作ServerHttpRequest對(duì)象和創(chuàng)建自定義Request請(qǐng)求包裝類兩種方式,此方法可用于替換Authorization請(qǐng)求頭中的token
    2026-04-04
  • java 如何使用org.w3c.dom操作XML文件

    java 如何使用org.w3c.dom操作XML文件

    這篇文章主要介紹了java 如何使用org.w3c.dom操作XML文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 使用SpringBoot?+?Vue?+?Redis實(shí)現(xiàn)驗(yàn)證碼登錄功能全過(guò)程

    使用SpringBoot?+?Vue?+?Redis實(shí)現(xiàn)驗(yàn)證碼登錄功能全過(guò)程

    在現(xiàn)代web應(yīng)用中,用戶驗(yàn)證是非常重要的一部分,這篇文章主要介紹了使用SpringBoot?+?Vue?+?Redis實(shí)現(xiàn)驗(yàn)證碼登錄功能的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • Spring事務(wù)傳播屬性和隔離級(jí)別詳細(xì)介紹

    Spring事務(wù)傳播屬性和隔離級(jí)別詳細(xì)介紹

    這篇文章主要介紹了Spring事務(wù)傳播屬性和隔離級(jí)別詳細(xì)介紹,同時(shí)涉及傳播行為介紹,超時(shí)設(shè)置等相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-09-09

最新評(píng)論

古田县| 丰原市| 峨眉山市| 高雄县| 石泉县| 上栗县| 安化县| 宁德市| 化隆| 高州市| 安龙县| 通山县| 青海省| 曲麻莱县| 成都市| 大石桥市| 大方县| 永寿县| 城市| 中西区| 布尔津县| 鸡东县| 门头沟区| 罗源县| 五大连池市| 宜川县| 昌江| 潜山县| 延川县| 慈利县| 苏尼特左旗| 沈阳市| 高雄市| 台前县| 葵青区| 广德县| 八宿县| 中阳县| 德江县| 稷山县| 郎溪县|