Chapter 8. 函式 (三):日期與時間8.3 日期與時間運算

8.3 日期與時間運算


第 2.5 節有提到過,日期與時間是「數字」的一種,是以 1899/12/30 為 0,之後每一天多加 1,既然日期與時間可以轉為數字,那肯定也可以進行加減,例如在日期運算中,DATE(2024,1,1)+1 就會輸出 2024/1/2,以此類推。如下圖所示:

瞭解日期運算的基本概念後,接下來將介紹多個計算日期時常用的函式:

  • EDATE / EOMONTH:輸出特定日期前後 n 個月的日期 / 最後一天:

語法

EDATE / EOMONTH (開始日期, [個月])

輸入

  • 開始日期:特定日期,必須是日期或可轉換為日期的文字格式,若有時間部分將會被無條件捨去。
  • 個月:要前 / 後幾個月,正數代表往後算、負數代表往前算,若並非整數會以無條件捨去計算。

輸出

  • EDATE:開始日期 前 / 後 個月 個月的日期。
  • EOMONTH:開始日期 前 / 後 個月 個月的最後一天。
  • DATEDIF / DAYS:計算兩個日期的間隔單位數 / 天數:

語法

  • DATEDIF (開始日期, 結束日期, 單位)
  • DAYS (結束日期, 開始日期)

輸入

  • 開始日期 / 結束日期:開始 / 結束日期,必須是日期或可轉換為日期的文字格式,若有時間部分將會被無條件捨去。
  • 單位:計算間隔的單位,共有以下六種:
    • "Y" / "M" / "D":年 / 月 / 日。
    • "YM":去掉年之後的月。
    • "MD":去掉月之後的日。
    • "YD":去掉年之後的日。

輸出

  • DATEDIF:開始日期 與 結束日期 的間隔 單位 數。
  • DAYS:開始日期 與 結束日期 的間隔天數。

由上述可知,DAYS 可用 DATEDIF (開始日期, 結束日期, "D") 取代。


  • WORKDAY / WORKDAY.INTL:計算某日後的幾個工作天是幾月幾號:

語法

  • WORKDAY (開始日期, 天數, [假日])
  • WORKDAY.INTL (開始日期, 天數, [週末], [假日])

輸入

  • 開始日期:特定日期,必須是日期或可轉換為日期的文字格式,若有時間部分將會被無條件捨去。
  • 天數:幾個工作天後,負數則為幾個工作天前,無條件捨去至整數位。
  • 假日:特殊假日清單,可以是陣列或範圍,必須是日期格式,不能是可轉換為日期的文字格式,預設沒有特殊假日。
  • 週末:哪幾天是非工作日,預設為 1,有兩種表達形式分別如下:
    • 字串形式:會是由七個 0 / 1 組成的字串,0 代表工作日、1 代表非工作日,從禮拜一開始算,例如 "1100001" 代表非工作日為週一、週二、週日。
    • 數字形式:1~7 或 11~17。
      • 1~7:1 代表週六 + 週日、2 代表週日 + 週一,以此類推。
      • 11~17:11 代表週日、12 代表週一,以此類推。

輸出

開始日期 後的 天數 個工作天的日期,在 WORKDAY 中假設 週末 為週六 + 週日,而 WORKDAY.INTL 可視為能自訂 週末 的 WORKDAY。

  • NETWORKDAYS / NETWORKDAYS.INTL:計算某段日期區間有幾個工作天:

語法

輸入

  • 開始日期 / 結束日期:開始 / 結束日期,必須是日期或可轉換為日期的文字格式,若有時間部分將會被無條件捨去。
  • 假日:特殊假日清單,預設沒有特殊假日,表達形式同 WORKDAY。
  • 週末:哪幾天是非工作日,預設為 1,表達形式同 WORKDAY。

輸出

開始日期 後的 天數 個工作天的日期,在 WORKDAY 中假設 週末 為週六 + 週日,而 WORKDAY.INTL 可視為能自訂 週末 的 WORKDAY。

開始日期 與 結束日期 之間有幾個工作天 (含頭尾),在 NETWORKDAYS 中假設 週末 為週六 + 週日,而 NETWORKDAYS.INTL 可視為能自訂 週末 的 NETWORKDAYS。

了解以下公式的用法後,接下來使用七個範例說明:

  1. 取得今天往回推 3 個月的日期

    公式

    =EDATE(TODAY(),-3)

    解說

    開始日期 可使用其他公式的輸出,在此使用 TODAY() 取得今天日期。


  1. 取得下個月底的日期

    公式

    =EOMONTH(TODAY(),1)

    解說

    開始日期 可使用其他公式的輸出,在此使用 TODAY() 取得今天日期。

  2. 取得今年年初日期

    公式

    • =DATE(YEAR(TODAY()),1,1)
    • =EOMONTH(TODAY(),-MONTH(TODAY()))+1

    解說

    • 可直接使用第 7.1~7.2 節介紹的函式,先取得今年年份,再使用 DATE 輸出今年的 1/1 即可。
    • 可使用 EOMONTH 取得去年底的日期,再加上 1 天得到今年年初的日期。其中去年底的日期即 EOMONTH(今天, -今天所在月份)。
  3. 計算今年迄今已過天數 (不含今日)

    公式

    • =DAYS(TODAY(),DATE(YEAR(TODAY()),1,1))
    • =DATEDIF(DATE(YEAR(TODAY()),1,1),TODAY(),"D")
    • =TODAY()-DATE(YEAR(TODAY()),1,1)

    解說

    上述三種方式都是計算今天、今年 1/1 的差距,其中今年 1/1 使用 C. 的第一種方式。使用時可依據自己平常的偏好使用。

  4. 計算 2022/8/17 與 2024/6/24 距離幾年、幾個月又幾天

    公式

    =DATEDIF("2022/8/17","2024/6/24","Y"),其中 "Y" 換成 "YM""MD"

    解說

    使用三個 DATEDIF 分別取得 幾年 / 幾個月 / 幾天。分別輸出 1 / 10 / 7,即間隔 1 年 10 個月又 7 天。

  5. 計算 2025/10/5 往後算 5 個上班日是哪一天

    公式

    • 不考慮國定假日:=WORKDAY("2025/10/5",5)
    • 考慮國定假日:=WORKDAY("2025/10/5",5,國定假日)

    解說

    其中 國定假日 是將 10 月的國定假日放在儲存格中,在此有 2025/10/6、2025/10/10,也可以使用陣列代替,在此為 =WORKDAY("2025/10/5",5,
    {DATEVALUE("2025/10/6"),DATEVALUE("2025/10/10")})。

  6. 計算 2025/10 整個月的上班日數

    公式

    • =NETWORKDAYS("2025/10/1","2025/10/31")
    • =NETWORKDAYS("2025/10/1","2025/10/31",國定假日)

    解說

    國定假日 是將 10 月的國定假日放在儲存格中,也可使用陣列代替。