如何将纪元时间戳转换回 TW 默认格式
-
我最近在制作一个插件,我使用了一个字段tmo_dueDate,值为2025-06-19,格式一类的。但现在有一个问题,我想要根据这个字段值判断与当前日期的时间,如果是今天则展示为今天,如果是明天则提示成明天,如果是两个月后则显示为两个月后。
因为TiddlyWiki是按YYYY0MM0DD0hh0mm0ss0XXX的形式处理字符串的。社区目前有两个插件,一个是Date Picker plugin,一个是根据Projectify改编而来的Pikaday。两者都是基于pikaday库。前者功能强大,但年代久远,是好几年前的插件了。后者比较新,且kookma应该会一直维护。但后者也不好调整,只能限定字段为due,且存储的值也是一长串数字,类似于created一长串的值。因而我也不想采用。
因而大胡子搞了一个小工具可以进行转换。
虽然也是两三年前的代码了,但我测试后可以在5.3.6版本中使用。
将上面的代码导入wiki后,要刷新一下加载js文件。
新建一个条目,名称随意,新建一个字段test,值为2025-06-19格式的。并把下面的代码放在正文中。
<$let today=<<now "YYYY-0MM-0DD">> format="[UTC]YYYY-0MM-0DD" oneday={{{ [[24]multiply[60]multiply[60]multiply[1000]] }}} yesterday={{{ [<today>parsedate[unixtime]subtract<oneday>parsedate:unixtime<format>] }}} tomorrow={{{ [<today>parsedate[unixtime]add<oneday>parsedate:unixtime<format>] }}} tmoTime={{{ [{!!test}parsedate[YYYY0MM0DD0hh0mm0ss0XXX]format:relativedate[YYYY-0MM-0DD]] }}}> <<yesterday>> <<tomorrow>> <%if [{!!test}match<yesterday>] %> 昨天 <%elseif [{!!test}match<tomorrow>] %> 明天 <%elseif [{!!test}match<today>] %> 今天 <%else%> <$text text=<<tmoTime>> /> <%endif%> </$let>
可以看到,上面的条件判断可以分析出是今天,还是明天还是什么时候。
这非常方便,因为我们可以做更多的样式处理。
-
我去查了一下论坛,发现早就有讨论过。而当时的pr也已经包含在最新版本中了。那么转换就有可能实现。而这个实现也确实比较不那么TiddlyWiki。代码如下。
<$let today=<<now "YYYY-0MM-0DD">> format="[UTC]YYYY-0MM-0DD" oneday={{{ [[24]multiply[60]multiply[60]multiply[1000]] }}} tmoTime={{{ [{!!test}search-replace:g[-],[]format:relativedate[]] }}} nowts=<<now "TIMESTAMP">> aaa={{{ [<nowts>format:timestamp[]] }}} yesterday={{{ [<nowts>subtract<oneday>format:timestamp[]] }}} tomorrow={{{ [<nowts>add<oneday>format:timestamp[]] }}} > * 现在时间:<$text text={{{ [<aaa>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} /> * 昨天时间:<$text text={{{ [<yesterday>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} /> * 明天时间:<$text text={{{ [<tomorrow>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} /> # <<nowts>> # 昨天时间 <<yesterday>> # 明天时间 <<tomorrow>> </$let>
有几个关键要点
now
宏竟然能传入TIMESTAMP,这个参数文档里没写-
- 你是怎么发现的,因为我以前也没遇到过
- 其次转换后timestamp,不需要进行额外处理,因为额外的处理可能会导致不生效
- 最后需要再把纪元时间戳转换成TiddlyWiki的时间格式
-
- 这里可根据需要改变呈现的形式。
-
想到一个取巧的办法,不一定对
<$let today=<<now "YYYY-0MM-0DD">> format="[UTC]YYYY-0MM-0DD" oneday={{{ [[24]multiply[60]multiply[60]multiply[1000]] }}} tmoTime={{{ [{!!test}search-replace:g[-],[]format:relativedate[]] }}} nowts=<<now "TIMESTAMP">> yesterday={{{ [<nowts>subtract<oneday>format:timestamp<format>] }}} tomorrow={{{ [<nowts>add<oneday>format:timestamp<format>] }}} > # <<today>> # <<yesterday>> # <<tomorrow>> # <<tmoTime>> </$let>
-
没有成功。
这里的问题在于,我们用timestamp转换后的实际数据是
1750443974491
,而这个数据也确实可以转换成日期格式。可以用下面网址查看。但TiddlyWiki的存储时间格式是
[UTC]YYYY0MM0DD0hh0mm0ss0XXX
,也就是像20250621182614444
这样的数据。目前没有提供一个函数,或者筛选器,或者宏之类的工具,可以把前者转换成后者。上面用js写的代码应该做了处理。
-
我去查了一下论坛,发现早就有讨论过。而当时的pr也已经包含在最新版本中了。那么转换就有可能实现。而这个实现也确实比较不那么TiddlyWiki。代码如下。
<$let today=<<now "YYYY-0MM-0DD">> format="[UTC]YYYY-0MM-0DD" oneday={{{ [[24]multiply[60]multiply[60]multiply[1000]] }}} tmoTime={{{ [{!!test}search-replace:g[-],[]format:relativedate[]] }}} nowts=<<now "TIMESTAMP">> aaa={{{ [<nowts>format:timestamp[]] }}} yesterday={{{ [<nowts>subtract<oneday>format:timestamp[]] }}} tomorrow={{{ [<nowts>add<oneday>format:timestamp[]] }}} > * 现在时间:<$text text={{{ [<aaa>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} /> * 昨天时间:<$text text={{{ [<yesterday>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} /> * 明天时间:<$text text={{{ [<tomorrow>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} /> # <<nowts>> # 昨天时间 <<yesterday>> # 明天时间 <<tomorrow>> </$let>
有几个关键要点
now
宏竟然能传入TIMESTAMP,这个参数文档里没写-
- 你是怎么发现的,因为我以前也没遇到过
- 其次转换后timestamp,不需要进行额外处理,因为额外的处理可能会导致不生效
- 最后需要再把纪元时间戳转换成TiddlyWiki的时间格式
-
- 这里可根据需要改变呈现的形式。
-
论坛不能改标题吗?我想改成
如何将纪元时间戳转换回 TW 默认格式
,这样更有针对性。 -
机 机杼 将这个主题转为问答主题
-
机 机杼 将这个主题标记为已解决