You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:05:28