最近在折腾 ob 的日记库,发现由 calendar 插件生成的周记是从当年的第一周起算了,如“2024 年第 41 周”
对于学生群体或者需要使用从某一特定日期起算周数的人士来说,这种写法是没有很大参考价值的,所以经过查询资料,我写了一个用 dataviewjs 生成当前学期周数的代码片段。
对于文件名为形如“2024 年第 41 周”的周记文件(这个我用 Periodic Notes 插件定义的),代码如下:
const fileTitle = dv.current().file.name;
const match = fileTitle.match(/(\d{4}) 年第 (\d+) 周/);
if (match) {
const year = parseInt(match[1], 10);
const weekNumber = parseInt(match[2], 10);
// 定义学期开始日期(按需修改)
const termStartDate = new Date(`${year}-09-02`);
const firstDayOfWeek = new Date(termStartDate);
firstDayOfWeek.setDate(firstDayOfWeek.getDate() - (firstDayOfWeek.getDay() || 7));
// 计算文件对应的日期
const fileDate = new Date(`${year}-01-01`);
fileDate.setDate(fileDate.getDate() + (weekNumber - 1) * 7);
// 计算文件日期是学期的第几周
const weekStart = new Date(fileDate);
weekStart.setDate(weekStart.getDate() - (weekStart.getDay() || 7) + 1);
const termWeekNumber = Math.ceil((weekStart - firstDayOfWeek) / (7 * 24 * 60 * 60 * 1000));
dv.paragraph(`**${year} 年秋季学期 第 ${termWeekNumber} 周**`);
} else {
dv.paragraph(`无法从文件标题中提取年份和周数。`);
}
之后把这个片段放到 Templater 的模板里,用的时候直接插入即可。
如果文件名不同,可以直接修改 fileTitle.match(/(\d{4}) 年第 (\d+) 周/);
里的正则表达式;输出在 dv.paragraph
里,可以按照喜好自行更改。
代码很简单,欢迎大家讨论与修改~