8.2.1 The date/time prompt

当 Org mode 提示输入日期/时间时,默认值会以标准日期/时间格式显示, 因此提示看起来像是要求特定格式。但实际上它支持多种格式的日期/时间输入。 通常信息应从字符串开头开始,Org mode 会提取已有信息, 并从 默认日期时间(default date and time) 补全未指定部分。 默认值通常为当前日期时间,但修改已有时间戳 或输入区间第二个时间戳时,会沿用缓冲区中的时间。 填写信息时,Org mode 假定你大多想输入未来日期: 若省略月/年且给定的日/月 早于 今天, 会自动识别为未来日期62。 若日期被自动顺延到未来,时间提示会显示 ‘(=>F)’ 。

例如,假设今天是 2006 年 6 月 13 日 。 以下是不同输入的解析结果,Org mode 自动补全的部分以 粗体 标出。

3-2-5⇒ 2003-02-05
2/5/3⇒ 2003-02-05
142006-06-14
122006-07-12
2/52007-02-05
Fri⇒ 最近的星期五(默认日期或之后)
sep 152006-09-15
feb 152007-02-15
sep 12 9⇒ 2009-09-12
12:452006-06-13 12:45
22 sept 0:342006-09-22 0:34
w42006 年的 ISO 第 4 周
2012 w4 fri⇒ 2012 年 ISO 第 4 周的星期五
2012-w04-5⇒ Same as above

此外,你可以在输入的 开头 指定相对日期:输入正负号、数字和字母—‘h’ 、 ‘d’ 、 ‘w’ 、 ‘m’ 或 ‘y’—分别表示小时、天、周、月或年的偏移量。使用 ‘h’ 时,日期相对于当前时间计算;使用其他字母且只有单个正负号时,日期相对于当日 00:00 计算。使用双正负号时,日期相对于默认日期计算。如果不用单个字母,而是使用星期几的缩写,则表示第 N 个对应星期几,例如:

+0⇒ 今天
.⇒ 今天
+2h⇒ 从现在起两小时后
+4d⇒ 从今天起四天后
+4⇒ 与 +4d 相同
+2w⇒ 从今天起两周后
++5⇒ 从默认日期起五天后
+2tue⇒ 从现在起第二个星期二

该函数支持英文月份与星期缩写。 若想使用完整名称或其他语言, 可配置变量 parse-time-monthsparse-time-weekdays

并非所有 Emacs 实现都能表示所有日期。 默认情况下,Org mode 会将日期限制在 1970–2037 的兼容区间, 以适配所有 Emacs 版本。若需使用该区间外的日期, 请查阅变量 org-read-date-force-compatible-dates 的文档。

你可以通过指定起止时间或开始时间加时长(HH:MM 格式)定义时间区间。 前者使用一个或两个短横线分隔,后者使用 ‘+’ 分隔,例如:

11am-1:15pm⇒ 11:00-13:15
11h-13h15⇒ 同上
11am--1:15pm⇒ 同上
11am+2:15⇒ 同上

在小缓冲提示的同时,会弹出日历63。 退出日期提示时(点击日历日期或按 RET), 日历选中日期会与提示行输入信息合并。 你可以在小缓冲中完全控制日历:

RET选中日历中光标所在的日期。
mouse-1点击选中对应日期。
S-RIGHT向后一天。
S-LEFT向前一天。
S-DOWN向后一周。
S-UP向前一周。
M-S-RIGHT向后一个月。
M-S-LEFT向前一个月。
>日历向后滚动一个月。
<日历向前滚动一个月。
M-v日历向后滚动三个月。
C-v日历向前滚动三个月。
C-.选中今天的日期64

日期/时间提示的逻辑看似复杂,但熟悉后会非常顺手, 甚至会对其他日期输入方式感到不适。 为帮助理解,小缓冲会实时显示当前输入的解析结果65


Footnotes

(62)

参见变量 org-read-date-prefer-future ,将其设为符号 time 可使早于当前时刻的时间自动跳转至次日。

(63)

若不需要日历, 可配置变量 org-popup-calendar-for-date-prompt

(64)

可使用日历命令 . 跳转至今日日期,但插入时间戳的小时部分时,. 会在小时后插入点号;与之相对,C-. 始终跳转至今日。

(65)

若觉得干扰, 可通过 org-read-date-display-live 关闭该显示。