Notion 函数生成日期属性

summary
在 Notion 的函数中,我们可以通过一个日期属性加减日期来得到一个日期属性。在没有其他日期属性的情况下,我们怎么把一段年月日文本转换为日期属性函数呢?
tags
Notion
Formula
Example
date
Mar 11, 2021
Chinese version
English version
在 Notion 的函数中,我们可以通过一个日期属性加减日期来得到一个日期属性。在没有其他日期属性的情况下,我们怎么把一段年月日文本转换为日期属性函数呢?
函数生成日期属性
Name
生成 2021 年 3 月 28 日
生成当月 6 号
生成本季度开始
Nov 29, 1999 04:00 PM
Nov 29, 1999 04:00 PM
Nov 29, 1999 04:00 PM
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:日期比较

日期先后比较
date
after
set date
Name
Mar 3, 2012
Nov 29, 1999 04:00 PM
Mar 2, 2021
Nov 29, 1999 04:00 PM
Mar 6, 2021
Nov 29, 1999 04:00 PM
Jul 9, 2021
Nov 29, 1999 04:00 PM
Notion 中的日期筛选器要选择一个较远的日期时,需要一个一个年份翻,此时就可以使用这样的日期比较函数,来获得一个是或不是的结果,放到筛选器里用。修改最后的<,>,或用<=,>=,分别表示你设定的日期之前,之后,当天或之前,当天或之后。也可以将两个函数合并为
dateBetween(prop("date1"), dateAdd(dateAdd(dateAdd(fromTimestamp(943891200000), 5, "days"), 3, "months"), 21, "years"), "minutes") > 0 

应用2:年月日文本→日期属性函数

年月日文本→日期属性函数
text date
separator
year raw
year
month
day
date property
Name
20181219
Nov 29, 1999 04:00 PM
030327
Nov 29, 1999 04:00 PM
2018.2.4
Nov 29, 1999 04:00 PM
1998/3/7
Nov 29, 1999 04:00 PM
13-1-9
Nov 29, 1999 04:00 PM
03027
Nov 29, 1999 04:00 PM
  • 使用
    • 输入 text date,转换为日期属性函数供后续使用。
    • 支持 /-. 分隔或无分隔,年份可省略开头的20,月份和日期在有分隔符时可为一位数字。
函数解析:
separator 获取分隔符 /-.. 用于正则表达式匹配时需使用 \.,由于 Notion的 bug,如果修改这个函数,会显示为 "\\." ,要在函数里重新改为 "\."),无分隔时获取位数 68,不符合则 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]+$", ""))))
yearyear 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 中):匹配 .
  • 如果文本是 日月年 或 月日年 的顺序,原理类似,可以自行研究。
 

© Niin Ni 2021 - 2024