Notion 函数生成日期属性
summary
在 Notion 的函数中,我们可以通过一个日期属性加减日期来得到一个日期属性。在没有其他日期属性的情况下,我们怎么把一段年月日文本转换为日期属性函数呢?
tags
Notion
Formula
Example
date
Mar 11, 2021
Chinese version
English version
在 Notion 的函数中,我们可以通过一个日期属性加减日期来得到一个日期属性。在没有其他日期属性的情况下,我们怎么把一段年月日文本转换为日期属性函数呢?
函数生成日期属性
Name
生成 2021 年 3 月 28 日
生成当月 6 号
生成本季度开始
dateAdd(dateAdd(dateAdd(fromTimestamp(943891200000), 28, "days"), 3, "months"), 21, "years")
这是示例“生成 2021 年 3 月 28 日”的函数,其中 28,3,21 分别为日,月,年(减 2000),且支持2000年前的年份。注意要按照日、月、年的顺序增减,否则日期会出错。
原理:对 1999年11月30日, 12:00:00 AM
增减日月年。这里用了时间戳 943891200000
来获得这个时间点。也可通过对当前时间不断 dateSubtract
的方式获得,函数会很长。见内:
有很多地方都可以用到这种做法,这里举例两个应用场景:
应用1:日期比较
日期先后比较
Notion 中的日期筛选器要选择一个较远的日期时,需要一个一个年份翻,此时就可以使用这样的日期比较函数,来获得一个是或不是的结果,放到筛选器里用。修改最后的<,>,或用<=,>=,分别表示你设定的日期之前,之后,当天或之前,当天或之后。也可以将两个函数合并为
dateBetween(prop("date1"), dateAdd(dateAdd(dateAdd(fromTimestamp(943891200000), 5, "days"), 3, "months"), 21, "years"), "minutes") > 0
应用2:年月日文本→日期属性函数
年月日文本→日期属性函数
- 使用:
- 输入
text date
,转换为日期属性函数供后续使用。 - 支持
/
或-
或.
分隔或无分隔,年份可省略开头的20,月份和日期在有分隔符时可为一位数字。
函数解析:
separator
获取分隔符 /
或 -
或 .
( .
用于正则表达式匹配时需使用 \.
,由于 Notion的 bug,如果修改这个函数,会显示为 "\\."
,要在函数里重新改为 "\."
),无分隔时获取位数 6
或 8
,不符合则 error
。
contains(prop("text date"), "/") ? "/" : (contains(prop("text date"), ".") ? "\\." : (contains(prop("text date"), "-") ? "-" : ((length(prop("text date")) == 8) ? "8" : ((length(prop("text date")) == 6) ? "6" : "error"))))
year raw
获取2位或4位的年份并转为数字。没有分隔符时用 slice
,有分隔符时用正则表达式匹配替换后两部分 prop("separator") + "[0-9]+" + prop("separator") + "[0-9]+$"
为空。
toNumber((prop("separator") == "error") ? "" : ((prop("separator") == "8") ? slice(prop("text date"), 0, 4) : ((prop("separator") == "6") ? slice(prop("text date"), 0, 2) : replace(prop("text date"), prop("separator") + "[0-9]+" + prop("separator") + "[0-9]+$", ""))))
year
将 year raw
中 <100 的处理为标准年份格式。
(prop("year raw") < 100) ? (2000 + prop("year raw")) : prop("year raw")
month
获取月份。没有分隔符时用 slice
,有分隔符时用正则表达式匹配替换前后两部分 "^[0-9]+" + prop("separator")
和 prop("separator") + "[0-9]+$"
为空。
toNumber((prop("separator") == "error") ? "" : ((prop("separator") == "8") ? slice(prop("text date"), 4, 6) : ((prop("separator") == "6") ? slice(prop("text date"), 2, 4) : replace(replace(prop("text date"), "^[0-9]+" + prop("separator"), ""), prop("separator") + "[0-9]+$", ""))))
day
获取日期。没有分隔符时用 slice
,有分隔符时用正则表达式匹配替换前两部分 "^[0-9]+" + prop("separator") + "[0-9]+" + prop("separator")
为空。
toNumber((prop("separator") == "error") ? "" : ((prop("separator") == "8") ? slice(prop("text date"), 6, 8) : ((prop("separator") == "6") ? slice(prop("text date"), 4, 6) : replace(prop("text date"), "^[0-9]+" + prop("separator") + "[0-9]+" + prop("separator"), ""))))
用到的正则表达式:
^
:开头
$
:结尾
[0-9]
:匹配数字
+
:匹配一个或多个
\.
(separator 中):匹配.
- 如果文本是 日月年 或 月日年 的顺序,原理类似,可以自行研究。