一、需求背景:从流水账到结构化复盘的归档逻辑
作为习惯用笔记软件记录生活的人,我希望实现这样的归档规则:
- 每日随手记录流水账(按日期命名)
- 每周汇总到对应周目录(按「年 / 月 + 周数」分级)
- 每月生成月度总结(按月份聚合每周内容)
核心需求是新建日记时自动生成「年 / 月 / 周 / 日」层级路径。其中关键逻辑在于:如何定义「周」的归属?
我采用「周一作为每周第一天」的规则,并设计两种周数计算方式:
- 年相对周数:以自然年为周期,计算全年第 N 周(如 2025 年第 1 周从 1 月第一个周一算起)
- 月相对周数:以自然月为周期,计算当月第 N 周(如 2025 年 6 月第 1 周从 6 月首个周一算起)
年相对周数
月相对周数
二、两种周数计算逻辑与实现代码
▌ 方案一:年相对周数(全年第 N 周)
代码拆解:
{{$currentWeekday := mod (now|Weekday|add 6) 7}} // 当前星期几(0=周一,1=周二...6=周日) {{$mondayOfThisWeek := now.AddDate 0 0 (mul -1 $currentWeekday | int)}} // 本周一日期 {{$firstDayOfYear := parseTime (join "-" (list ($mondayOfThisWeek.Year|toString) "01-01"))}} // 本年第一天 {{$daysDifference := $mondayOfThisWeek.Sub $firstDayOfYear }} // 距离本年第一天的秒数差 {{$weekNumber := div (div $daysDifference.Seconds 86400 |int|add 7) 7}} // 本年第几周,本年的第一个周一起算第一周。 {{$yearMonthOfMonday := $mondayOfThisWeek| date "2006/01"}} //本周所属月份,按照本周周一所在月份计算。 本周所属月份{{$mondayOfThisWeek| date "2006/01"}} 本周是第{{$weekNumber}}周
合并在一起,新建日记的路径如下:
{{$currentWeekday := mod (now|Weekday|add 6) 7}} {{$mondayOfThisWeek := now.AddDate 0 0 (mul -1 $currentWeekday | int)}}{{$firstDayOfYear := parseTime (join "-" (list ($mondayOfThisWeek.Year|toString) "01-01"))}}{{$daysDifference := $mondayOfThisWeek.Sub $firstDayOfYear }}{{$weekNumber := div (div $daysDifference.Seconds 86400 |int|add 7) 7}}daily note/{{$mondayOfThisWeek| date "2006/01"}}/第{{$weekNumber}}周/{{now | date "2006-01-02"}}
在 TestTemplate 插件中测试效果如下:
▌ 方案二:月相对周数(当月第 N 周)
代码拆解:
{{$currentWeekday := mod (now|Weekday|add 6) 7}} // 当前星期几(0=周一,1=周二...6=周日) {{$mondayOfThisWeek := now.AddDate 0 0 (mul -1 $currentWeekday | int)}} // 本周一日期 {{$firstDayOfMonth := parseTime (join "-" (list ($mondayOfThisWeek | date "2006-01"|toString) "01"))}} // 本月的第一天 {{$daysDifference := $mondayOfThisWeek.Sub $firstDayOfMonth }} // 距离本月第一天的秒数差 {{$weekNumber := div (div $daysDifference.Seconds 86400 |int|add 7) 7}} // 本月第几周,本月的第一个周一起算第一周。 {{$yearMonthOfMonday := $mondayOfThisWeek| date "2006/01"}} //本周所属月份,按照本周周一所在月份计算。 本周所属月份{{$mondayOfThisWeek| date "2006/01"}} 本周是第{{$weekNumber}}周
合并在一起,新建日记的路径如下:
{{$currentWeekday := mod (now|Weekday|add 6) 7}} {{$mondayOfThisWeek := now.AddDate 0 0 (mul -1 $currentWeekday | int)}}{{$firstDayOfMonth := parseTime (join "-" (list ($mondayOfThisWeek | date "2006-01"|toString) "01"))}}{{$daysDifference := $mondayOfThisWeek.Sub $firstDayOfMonth }}{{$weekNumber := div (div $daysDifference.Seconds 86400 |int|add 7) 7}}{{$yearMonthOfMonday := $mondayOfThisWeek| date "2006/01"}}daily note/{{$mondayOfThisWeek| date "2006/01"}}/第{{$weekNumber}}周/{{now | date "2006-01-02"}}
在 TestTemplate 插件中测试效果如下:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于