请仔细说明自己遇到的问题,以下是参考模板。这里不要求非得按模板发帖,但内容中包含相关要素能让大家更好地帮助你。
遇到的问题
使用dataview行内设置倒计时,时间总是错误的?使用的试一下代码:
=(date(today) - date("2016-03-27")).days
实际天数应该是已经过去3336天,但是显示为3333天,如图所示:
预期的效果
继续使用行内查询设置倒计时,有什么解决方法?
请仔细说明自己遇到的问题,以下是参考模板。这里不要求非得按模板发帖,但内容中包含相关要素能让大家更好地帮助你。
使用dataview行内设置倒计时,时间总是错误的?使用的试一下代码:
=(date(today) - date("2016-03-27")).days
实际天数应该是已经过去3336天,但是显示为3333天,如图所示:
继续使用行内查询设置倒计时,有什么解决方法?
可能是两方面原因, 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