更新於 2024/11/24閱讀時間約 14 分鐘

Notion Formula 2.0 § 日期公式常用篇

前言

之前我寫過一篇〈Notion 日期相關公式〉,隨著公式函數進入 2.0 時代,一些函數有了新增或調整,使得公式編輯更加精簡。

回想起我學習 SQL 時,最不喜歡的就是處理與「時間」相關的程式碼,因為日期格式繁多,處理起來相當麻煩。但很多資料的調用都與日期、時間有關,因此練習與時間相關的函數是非常重要。

下方圖片篩選出與日期時間相關的函數,詳細的函數列表可以參考〈Notion 函數指南〉。

在編寫公式時,請注意每種不同的函數資料屬性,下面列出與日期相關,但輸出格式不是日期時間的函數:

  • 「文字」屬性:formatDate(date, text)
  • 「數字」屬性:dateBetween()timestamp(date)minute(date)hour(date)day(date)date(date)month(date)year(date)

昨天、今天、明天

💡 以下的公式顯示以 2024/09/08 19:30 為例

/* 昨天 */
dateAdd(now(), -1, "days")
dateSubtract(now(), 1, "days")

/* 今天 */
now()/* 顯示 September 8, 2024 7:30 PM */
today() /* 顯示 September 8, 2024 */

/* 明天 */
dateAdd(now(), 1, "days")

活用formatDate創造各種呈現方式

時間 Time

/* 顯示 7:30 PM */
formatDate(prop("日期時間"), "h:mm A")
formatDate(prop("日期時間"), "LT")

/* 顯示 7:30 pm */
formatDate(prop("日期時間"), "h:mm a")

/* 顯示 19:30 */
formatDate(prop("日期時間"), "H:mm")

/* 顯示 19 */
formatDate(prop("日期時間"), "k")

周幾 Weekday

/* 顯示數字,如:0 */
formatDate(prop("日期時間"), "d")

/* 顯示兩個英文字,如:Su */
formatDate(prop("日期時間"), "dd")

/* 顯示三個英文字,如:Sun */
formatDate(prop("日期時間"), "ddd")

/* 顯示全部英文字,如:Sunday */
formatDate(prop("日期時間"), "dddd")

日期 Date

/* 顯示 8 */
formatDate(prop("日期時間"), "D")

/* 顯示 08 */
formatDate(prop("日期時間"), "DD")

/* 該日期在今年的第幾天,如:2024/09/08,顯示 252 */
formatDate(prop("日期時間"), "DDD")

第幾周 Week

/* 從周日起算,如:2024/09/08,顯示 37 */
formatDate(prop("日期時間"), "w")

/* 從周一起算,如:2024/09/08,顯示 36 */
formatDate(prop("日期時間"), "W")

月份 Month

/* 顯示 9 */
formatDate(prop("日期時間"), "M")

/* 顯示 09 */
formatDate(prop("日期時間"), "MM")

/* 顯示 Sep */
formatDate(prop("日期時間"), "MMM")

/* 顯示 September */
formatDate(prop("日期時間"), "MMMM")

季度 Quarter

/* 顯示 3 */
formatDate(prop("日期時間"), "Q")

/* 顯示 03 */
formatDate(prop("日期時間"), "QQ")

年分 Year

/* 顯顯示 2024 */
formatDate(prop("日期時間"), "Y")
formatDate(prop("日期時間"), "YYYY")

/* 顯示 24 */
formatDate(prop("日期時間"), "YY")

時區 Timezone

/* 顯示該時區,如:GMT+8 */
formatDate(prop("日期時間"), "z")

/* 顯示該時區,如:+08:00 */
formatDate(prop("日期時間"), "Z")

/* 顯示該時區,如:+0800 */
formatDate(prop("日期時間"), "ZZ")

各種不同的日期顯示格式

/* 顯示 9/8/2024 */
formatDate(prop("日期時間"), "l")

/* 顯示 Sep 8, 2024 */
formatDate(prop("日期時間"), "ll")

/* 顯示 Sep 8, 2024 7:30 PM */
formatDate(prop("日期時間"), "lll")

/* 顯示 Sun, Sep 8, 2024 7:30 PM */
formatDate(prop("日期時間"), "llll")

/* 顯示 09/08/2024 */
formatDate(prop("日期時間"), "L")

/* 顯示 September 8, 2024 */
formatDate(prop("日期時間"), "LL")

/* 顯示 September 8, 2024 7:30 PM */
formatDate(prop("日期時間"), "LLL")

/* 顯示 Sunday, September 8, 2024 7:30 PM */
formatDate(prop("日期時間"), "LLLL")

關於「月份」的其他運算

該日期所在月份的第一天,如9月8日該月的第一天是9月1日

dateSubtract(prop("日期時間"), date(prop("日期時間")) - 1, "days")

該日期所在月份的最後一天,如9月8日該月的最後一天是9月30日

lets(
本月第一天, dateSubtract(prop("日期時間"), date(prop("日期時間")) - 1, "days"),
次月第一天, dateAdd(本月第一天, 1, "months"),
本月最後一天, dateSubtract(次月第一天, 1, "days"),
本月最後一天
)

日期所在月份總天數

lets(
本月第一天, dateSubtract(prop("日期時間"), date(prop("日期時間")) - 1, "days"),
次月第一天, dateAdd(本月第一天, 1, "months"),
本月最後一天, dateSubtract(次月第一天, 1, "days"),
本月總天數, date(本月最後一天),
本月總天數
)

該日期所在該月份的哪一周 (周一~週日)

lets(
日期, date(prop("日期時間")),
本月第一天, dateSubtract(prop("日期時間"), 日期 - 1, "days"),
星期幾, day(本月第一天),
第幾周, ceil((日期 + 星期幾 - 1) / 7),
第幾周
)

日期所在的月份總周數

lets(
日期, date(prop("日期時間")),
本月第一天, dateSubtract(prop("日期時間"), 日期 - 1, "days"),
次月第一天, dateAdd(本月第一天, 1, "months"),
本月最後一天, dateSubtract(次月第一天, 1, "days"),
ceil((date(本月最後一天) + day(本月第一天)) / 7)
)

時間區間的運算

時間區間包含幾小時、幾分鐘。

lets(
開始時間, dateStart(prop("日期時間")),
結束時間, dateEnd(prop("日期時間")),
小時, dateBetween(結束時間, 開始時間, "hours"),
分鐘, dateBetween(結束時間, 開始時間, "minutes") % 60,
小時 + " hr " + 分鐘 + " min"
)

時間區間包含幾天、幾小時、幾分鐘。

lets(
開始時間, dateStart(prop("日期時間")),
結束時間, dateEnd(prop("日期時間")),
天數, dateBetween(結束時間, 開始時間, "days"),
小時, dateBetween(結束時間, 開始時間, "hours"),
分鐘, dateBetween(結束時間, 開始時間, "minutes") % 60,
天數 + " dy " + 小時 + " hr " + 分鐘 + " min"
)

判斷日子

在處理 To Do List、GTD(Getting Things Done)或進行回顧(Review)時,經常需要自動化顯示特定時間段的內容。雖然 Notion 的篩選器可以達到部分效果,但如果能通過公式編寫,會有更大的靈活性與彈性。

/* 是否為"昨天" */
formatDate(prop("日期時間"), "L") == formatDate(dateSubtract(now(), 1, "days"), "L")

/* 是否為"今天" */
formatDate(prop("日期時間"), "L") == formatDate(today(), "L")

/* 是否為"明天" */
formatDate(prop("日期時間"), "L") == formatDate(dateAdd(now(), 1, "days"), "L")

/* 是否為"本周" (W 是周一~周日,w 是週日~周六)
多判斷 Y,是為了避免隔一年還會出現前一年的資料 */
formatDate(prop("日期時間"), "WY") == formatDate(now(), "WY")

/* 是否為"本月" */
formatDate(prop("日期時間"), "MY") == formatDate(now(), "MY")

/* 判斷是否為"今年" */
formatDate(prop("日期時間"), "YYYY") == formatDate(now(), "YYYY")

/* 判斷是否為"星期幾" */
formatDate(prop("日期時間"), "dddY") == formatDate(now(), "dddY")

/* 判斷現在的日期時間是否是在指定日期時間中 */
/* 法一:運用 formatDate() 格式化顯示方式 */
and(formatDate(now(), "L") >= formatDate(dateStart(prop("日期時間")), "L"), formatDate(now(), "L") <= formatDate(dateEnd(prop("日期時間")), "L"))

/* 法二:對日期直接運算,再判斷 */
and(now() >= dateStart(prop("日期時間")), now() <= dateAdd(dateEnd(prop("日期時間")), 1, "days"))

結語

我們回顧了常用的日期函數與基礎公式,並結合新函數進行編輯,另外,特別強調了「月份」相關的運算,主要因為下方有一道練習題,希望大家可以藉此體驗let()函數的靈活性。

練習題


結合之前文章〈Notion Formula 2.0 § Progress Bar 進度條〉的內容,讓我們來練習製作「自動倒數進度條」。




簡單需求分析如下:

  1. 當天日期 now(),相對於年、月、週、日的倒數進度條。(如 2024.10.15 是 2024 年的第 288 天,約佔 79%)。
  2. 設計如圖中的進度條 + 時間區間樣式。

此練習題會在之後的文章公布我的答案,歡迎各位同好們將自己思路或編寫的公式與大家分享優❤️~

參考資料


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.