基于 dataviewjs 的学期周数获取

最近在折腾 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 里,可以按照喜好自行更改。

代码很简单,欢迎大家讨论与修改~

3 个赞