问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

思源笔记数据库模板:优化日期计算代码

创作时间:
作者:
@小白创作中心

思源笔记数据库模板:优化日期计算代码

引用
CSDN
7
来源
1.
https://m.blog.csdn.net/lizhengwei26/article/details/81120083
2.
https://www.jianshu.com/p/d9da9d1bdd08
3.
https://docs.gomplate.ca/functions/time/
4.
https://discuss.logseq.com/t/i-want-help-custom-templates-for-logseq/28526
5.
https://discuss.logseq.com/t/good-way-of-documenting-in-logseq/28034
6.
https://www.logseqmastery.com/blog/logseq-templates
7.
https://m.seaxiang.com/blog/kWjnvH

在使用思源笔记的数据库模板时,用户希望优化日期计算的代码,避免使用小时计算,直接用天数计算。然而,由于Go语言模板的限制,直接计算天数差并不像想象中那么简单。

01

为什么需要使用秒数截断?

在Go语言中,时间差是通过time.Duration类型来表示的,它以纳秒为单位。当我们需要计算两个时间点之间的天数差时,实际上是在处理纳秒级别的计算。然而,Go模板并不支持直接对纳秒进行操作,因此我们需要将纳秒转换为更易处理的单位,比如秒。

使用86400秒(即24小时)作为截断单位,实际上是在将时间戳对齐到当天的0点,从而实现日期的截断。这种做法虽然在表面上看起来是在处理小时,但实际上是在为天数计算做准备。

02

如何实现更直观的天数计算?

尽管Go模板不支持直接计算天数差,我们仍然可以通过一些技巧来实现更直观的计算。关键在于如何将日期截断到天,然后计算天数差。

在之前的代码中,我们使用了以下方法:

.action{$delta_days := div ($deadlineMidnight.Sub $nowMidnight).Hours 24}

这段代码实际上是在计算天数差,但使用了小时作为中间单位,这可能让用户感到困惑。为了使代码更直观,我们可以直接使用秒数进行计算:

.action{$delta_days := div ($deadlineMidnight.Sub $nowMidnight) 86400}

但需要注意的是,Go模板可能不支持直接对time.Duration进行除法运算。因此,我们需要先将time.Duration转换为秒数,然后再进行除法运算:

.action{$delta_days := div (div ($deadlineMidnight.Sub $nowMidnight).Seconds 86400) 1}

虽然这样的代码可能看起来更复杂,但它明确地展示了我们是在计算天数差,而不是小时差。

03

完整代码示例

以下是优化后的完整代码示例:

{{$now := time.Now}}
{{$deadline := time.Parse "2006-01-02" .date}}
{{$nowMidnight := $now.Truncate 86400}}
{{$deadlineMidnight := $deadline.Truncate 86400}}
{{$delta := $deadlineMidnight.Sub $nowMidnight}}
{{$delta_days := div (div $delta.Seconds 86400) 1}}

<p>当前时间:{{$now.Format "2006-01-02 15:04:05"}}</p>
<p>截止日期:{{$deadline.Format "2006-01-02"}}</p>
<p>距离截止日期还有:{{$delta_days}}天</p>

这段代码首先获取当前时间和截止日期,然后将两者都截断到当天的0点。接着计算两个时间点之间的差值,并将其转换为秒数。最后,将秒数除以86400得到天数差。

通过这样的优化,我们不仅满足了用户的需求,避免了显式的小时计算,还使代码的逻辑更加清晰和直观。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号