如何在Obsidian的YAML中使用MomentJS实现BC日期的Dataview查询?
Obsidian中BC日期的Dataview展示解决方案
一、YAML元数据存储规范
直接用带负号的ISO字符串存BC日期,必须加引号避免Obsidian误解析为数字:
--- name: 苏格拉底 dob: "-469-05-20" ---
--- name: 柏拉图 dob: "-427-12-25" ---
AD日期正常存字符串或直接写ISO格式都可以,比如dob: "384-01-20"。
二、Dataview查询正确写法(解决BC条目消失问题)
之前用dob.year导致BC条目消失,是因为Obsidian没把带负号的BC日期识别为日期对象,字符串没有.year()属性,必须手动用内置的MomentJS解析:
基础展示查询
TABLE moment(dob).format("YYYY-MM-DD (GG)") AS 完整日期, let year = moment(dob).year(); year < 0 ? abs(year) + " BC" : year + " AD" AS 年份, name AS 姓名 FROM "历史人物" WHERE dob
这个查询会自动把BC年份转成“数字+BC”的格式,AD年份显示“数字+AD”,同时完整日期会标注纪元(比如-469-05-20 (公元前))。
筛选BC人物查询
如果只想展示公元前的人物:
TABLE moment(dob).format("YYYY-MM-DD (GG)") AS 完整日期, abs(moment(dob).year()) + " BC" AS 年份, name AS 姓名 FROM "历史人物" WHERE moment(dob).year() < 0
三、进阶:用DataviewJS简化重复操作
如果经常要处理历史日期,可以写个自定义函数统一处理:
// 自定义函数:格式化历史日期 function formatHistDate(dateStr) { const m = moment(dateStr); const year = m.year(); return { full: m.format("YYYY-MM-DD (GG)"), yearText: year < 0 ? `${Math.abs(year)} BC` : `${year} AD` }; } // 生成表格 dv.table( ["姓名", "出生日期", "年份"], dv.pages("历史人物") .where(p => p.dob) .map(p => [ p.name, formatHistDate(p.dob).full, formatHistDate(p.dob).yearText ]) );
内容的提问来源于stack exchange,提问作者Bendy
相关产品推荐
相关产品推荐

