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

如何定义并持久化Emacs Calc中的美国联邦节假日?

配置Emacs Calc美国联邦节假日规则并持久化

一、可行性与规则定义方法

  • 完全可行,Emacs Calc支持通过规则表达式定义动态节假日,无需每年手动更新具体日期。
  • 核心函数说明:
    • newweek N D M Y:返回年份Y中月份M的第N个周几D对应的日期。参数规则:
      • N:正数表示第N个目标周几,负数表示倒数第|N|个(例如-1代表最后一个)
      • D:周几编号,0=周日,1=周一,4=周四,6=周六
      • M:月份(1-12)
      • Y:年份变量,用var-y表示当前计算的年份
    • date M D Y:返回给定日期(年Y、月M、日D)对应的周几编号(0-6),用于判断调休逻辑
  • 美国联邦节假日规则表达式:
    • 马丁路德金纪念日:newweek(3,1,1,var-y)(1月第3个周一)
    • 华盛顿诞辰:newweek(3,1,2,var-y)(2月第3个周一)
    • 阵亡将士纪念日:newweek(-1,1,5,var-y)(5月最后一个周一)
    • 劳动节:newweek(1,1,9,var-y)(9月第1个周一)
    • 哥伦布日:newweek(2,1,10,var-y)(10月第2个周一)
    • 感恩节:newweek(4,4,11,var-y)(11月第4个周四)
    • 元旦、独立日需结合调休规则定义
  • 文档位置:打开Calc后按?进入帮助搜索newweek或date;也可通过C-h i打开Info手册,导航到Calc > Date and Time Functions章节查看详细说明。

二、持久化配置到~/.emacs

直接在~/.emacs或~/.emacs.d/init.el中定义var-Holidays变量即可,无需使用m m命令(该命令用于保存Calc会话状态,而非全局配置)。为确保配置在Calc加载后生效,用eval-after-load包裹:

(eval-after-load 'calc
  '(setq var-Holidays
         '(vec (var sat var-sat) (var sun var-sun)
               ;; 元旦:原日期 + 周六/周日补休下周一
               (calcFunc-date (var y var-y) 1 1)
               (if (or (= (calcFunc-date (var y var-y) 1 1) 6)
                       (= (calcFunc-date (var y var-y) 1 1) 0))
                   (calcFunc-date (var y var-y) 1
                                  (if (= (calcFunc-date (var y var-y) 1 1) 6)
                                      3 2))
                 0)
               ;; 马丁路德金纪念日(1月第3个周一)
               (calcFunc-newweek 3 1 1 (var y var-y))
               ;; 华盛顿诞辰(2月第3个周一)
               (calcFunc-newweek 3 1 2 (var y var-y))
               ;; 阵亡将士纪念日(5月最后一个周一)
               (calcFunc-newweek -1 1 5 (var y var-y))
               ;; 独立日:原日期 + 周六/周日补休下周一
               (calcFunc-date (var y var-y) 7 4)
               (if (or (= (calcFunc-date (var y var-y) 7 4) 6)
                       (= (calcFunc-date (var y var-y) 7 4) 0))
                   (calcFunc-date (var y var-y) 7
                                  (if (= (calcFunc-date (var y var-y) 7 4) 6)
                                      6 5))
                 0)
               ;; 劳动节(9月第1个周一)
               (calcFunc-newweek 1 1 9 (var y var-y))
               ;; 哥伦布日(10月第2个周一)
               (calcFunc-newweek 2 1 10 (var y var-y))
               ;; 退伍军人节(11月11日)
               (calcFunc-date (var y var-y) 11 11)
               ;; 感恩节(11月第4个周四)
               (calcFunc-newweek 4 4 11 (var y var-y))
               ;; 圣诞节(12月25日)
               (calcFunc-date (var y var-y) 12 25))))

三、验证配置

重启Emacs后,打开Calc执行以下命令验证效果:

  • 测试独立日调休:calc-eval "badd(<Fri Jul 1, 2022>,1)" 应返回<Tue Jul 5, 2022>(跳过周一的7月4日)
  • 测试元旦调休:calc-eval "badd(<Fri Dec 31, 2021>,1)" 应返回<Mon Jan 3, 2022>(跳过周六的1月1日和补休的周一1月3日)
  • 测试感恩节规则:calc-eval "date(newweek(4,4,11,2023))" 应返回4(对应周四,日期为<Thu Nov 23, 2023>)

内容的提问来源于stack exchange,提问作者Siegfried

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:27:31