使用dataview行内查询设置倒计时,时间总是错误的?请大神指教!

请仔细说明自己遇到的问题,以下是参考模板。这里不要求非得按模板发帖,但内容中包含相关要素能让大家更好地帮助你。


遇到的问题

使用dataview行内设置倒计时,时间总是错误的?使用的试一下代码:
=(date(today) - date("2016-03-27")).days
实际天数应该是已经过去3336天,但是显示为3333天,如图所示:
image

预期的效果

继续使用行内查询设置倒计时,有什么解决方法?

可能是两方面原因, 1 时间间隔本身就没算对, 2 算出日期间隔后, 已经丢弃了具体起止日期导致无法考虑闰年等

实验:

`= dur(10 years).days`
这个会返回 3650 一般场合里都是指连续十年, 显然应该有闰年
但是"时间间隔"自身不含起止日期, 确实也没更好办法

`= dur(2 months).days`
返回 60 
即每个月都视为 30 天


`= (date("2025-05-15") - date("2016-03-27"))`
返回 9年、1个月、2周、4天 (按照一年=365, 一月=30, 则这个数是 3333)
应为 3336

`= (date("2025-05-15") - date("2016-03-27")).days`
返回 3333
应为 3336

`= (date("2025-05-15") - date("2016-03-27")).seconds`
返回 287971200
287971200/24/3600 = 3333

参考这里的讨论 dur() calculation is wrong for dates almost a year apart · Issue #2562 · blacksmithgu/obsidian-dataview 这跟 dataview 内部调 luxon .diff().shiftToAll() 的细节有关, 当使用 dv 计算日期间隔时, 它一定会在内部调 .shiftToAll(), 而 .shiftToAll().shiftTo() 的计算过程会丢失时间起止信息, 并按照 casual 方式来转换

简单结论是, 现在拿 dataview 确实算不准, 想要准确结果可以改用 dataviewjs

例如

纯 js 方案
`$= (new Date('2025-05-15') - new Date('2016-03-27')) / (1000 * 60 * 60 * 24)`
返回 3336 


结合使用 dataviewjs + luxon 方案
`$= dv.date("2025-05-15").diff(dv.date("2016-03-27"), "days").days`
返回 3336