之前我寫過一篇〈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
創造各種呈現方式/* 顯示 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")
/* 顯示數字,如:0 */
formatDate(prop("日期時間"), "d")
/* 顯示兩個英文字,如:Su */
formatDate(prop("日期時間"), "dd")
/* 顯示三個英文字,如:Sun */
formatDate(prop("日期時間"), "ddd")
/* 顯示全部英文字,如:Sunday */
formatDate(prop("日期時間"), "dddd")
/* 顯示 8 */
formatDate(prop("日期時間"), "D")
/* 顯示 08 */
formatDate(prop("日期時間"), "DD")
/* 該日期在今年的第幾天,如:2024/09/08,顯示 252 */
formatDate(prop("日期時間"), "DDD")
/* 從周日起算,如:2024/09/08,顯示 37 */
formatDate(prop("日期時間"), "w")
/* 從周一起算,如:2024/09/08,顯示 36 */
formatDate(prop("日期時間"), "W")
/* 顯示 9 */
formatDate(prop("日期時間"), "M")
/* 顯示 09 */
formatDate(prop("日期時間"), "MM")
/* 顯示 Sep */
formatDate(prop("日期時間"), "MMM")
/* 顯示 September */
formatDate(prop("日期時間"), "MMMM")
/* 顯示 3 */
formatDate(prop("日期時間"), "Q")
/* 顯示 03 */
formatDate(prop("日期時間"), "QQ")
/* 顯顯示 2024 */
formatDate(prop("日期時間"), "Y")
formatDate(prop("日期時間"), "YYYY")
/* 顯示 24 */
formatDate(prop("日期時間"), "YY")
/* 顯示該時區,如: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 進度條〉的內容,讓我們來練習製作「自動倒數進度條」。
簡單需求分析如下:
now()
,相對於年、月、週、日的倒數進度條。(如 2024.10.15 是 2024 年的第 288 天,約佔 79%)。此練習題會在之後的文章公布我的答案,歡迎各位同好們將自己思路或編寫的公式與大家分享優❤️~