systemd.time 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 . 指令索引systemd-231

名称

systemd.time — 时间与日期规范

描述

在 systemd 环境中,时间戳(一个时间点)、时间长度(一段时间)、日历事件 的显示和赋值都有严格的规范和语法。

时长的显示

"时长"是"时间长度"的简称,又被称为"时间间隔",表示一段时间的长度。 显示为一个空格分隔的带有时间单位的时长序列。 例如:

2h 30min

将序列中的每一段加起来就是最终的结果: 150分钟

时长的赋值

systemd 在解析时长字符串(用于赋值)的时候, 接受与时长的显示类似的语法,不同之处在于可以省略空格。 可以理解的时间单位如下:

  • usec, us

    (微秒)
  • msec, ms

    (毫秒)
  • seconds, second, sec, s

    (秒)
  • minutes, minute, min, m

    (分钟)
  • hours, hour, hr, h

    (小时)
  • days, day, d

    (天)
  • weeks, week, w

    (星期)
  • months, month, M

    (月)[=30.44天]
  • years, year, y

    (年)[=365.25天]

如果没有指定时间单位,一般默认为秒, 但是偶尔也有例外。 此外,在某些场合还可以接受纳秒单位("ns", "nsec")。

下面是一些有效的时长字符串实例:

2 h
2hours
48hr
1y 12month
55s500ms
300ms20s 5day

时间戳的显示

时间戳表示的是一个独一无二的时间点, systemd 会按照本地时区格式化之后显示, 例如:

Fri 2012-11-23 23:02:15 CET

其中表示"星期"的部分会根据系统的本地化设置(locale),以本地语言显示。

时间戳的赋值

systemd 在解析时间戳字符串(用于赋值)的时候, 接受与时间戳的显示类似的语法。不同之处在于: (1)尾部的"时区"部分,要么必须省略,要么必须丝毫不差的设为"UTC"三个大写字母。 省略时区表示使用本机时区,而设为"UTC"则表示使用世界统一时间(相当于格林威治时间)。 (2)头部的"星期"部分可以省略(强烈建议省略)。如果一定要指定这部分, 那么必须使用英文三字母缩写(例如"Wed")或英文全称(例如"Wednesday"), 大小写无所谓,但是不得使用任何其他语言的表示法。 (3)"年-月-日"与"时:分:秒"两部分,可以省略二者之一,但是不可全部省略。 若省略前者,则表示使用当前日期,若省略后者则表示使用"00:00:00"。 (4)"时:分:秒"部分,可以只省略":秒",相当于使用":00"。 (5)"年-月-日"部分,其中的"年"可以省略为2位数字表示, 相当于"20xx"(强烈反对此种用法)。

如果指定的"星期"与"年-月-日"(即使此部分已被省略)不相符, 那么该时间戳将被视为无效。

除了接受上述语法之外,还可以使用一些时间戳关键字: "now" 表示当前时间; "today", "yesterday", "tomorrow" 分别表示今天/昨天/明天的零点(00:00:00)。

除了接受上述语法之外,还可以使用一些相对时间表示法: 给一个时长(见上文)加上 "+" 前缀或者 " left" 后缀(注意有空格), 表示以当前时间为基准向未来前进指定的时长; 给一个时长(见上文)加上 "-" 前缀或者 " ago" 后缀(注意有空格), 表示以当前时间为基准向过去倒退指定的时长;

最后,给一个时长(见上文)加上 "@" 前缀表示相对于UNIX时间原点(1970-01-01 00:00:00 UTC)之后多长时间。

假定当前时间为北京时间[UTC+8] 2012-11-23 18:15:22 , 系统时区 TZ=PRC (中华人民共和国的通用时区)。 下面是一些时间戳实例及其标准化形式:

Fri 2012-11-23 11:12:13 → Fri 2012-11-23 11:12:13
    2012-11-23 11:12:13 → Fri 2012-11-23 11:12:13
2012-11-23 11:12:13 UTC → Fri 2012-11-23 19:12:13
             2012-11-23 → Fri 2012-11-23 00:00:00
               12-11-23 → Fri 2012-11-23 00:00:00
               11:12:13 → Fri 2012-11-23 11:12:13
       11:12:13.9900009 → Fri 2012-11-23 11:12:13
                          format_timestamp_us: Fri 2012-11-23 11:12:13.990000
                  11:12 → Fri 2012-11-23 11:12:00
                    now → Fri 2012-11-23 18:15:22
                  today → Fri 2012-11-23 00:00:00
              today UTC → Fri 2012-11-23 16:00:00
              yesterday → Fri 2012-11-22 00:00:00
               tomorrow → Fri 2012-11-24 00:00:00
               +3h30min → Fri 2012-11-23 21:45:22
           +3h30min UTC → 无效的时间戳
                    -5s → Fri 2012-11-23 18:15:17
              11min ago → Fri 2012-11-23 18:04:22
          11min ago UTC → 无效的时间戳
            @1395716396 → Tue 2014-03-25 03:59:56

注意,systemd 显示的绝对时间戳 并不能被直接用于赋值(可能会被错误的解析)。原因有二: (1)"时区"部分显示的是本机时区; (2)"星期"部分可能是非英语;

有时候, systemd 还可能会显示相对时间戳(相对于当前时间或命令的调用时间), 例如:

2 months 5 days ago

systemd 显示的相对时间戳可以直接用于赋值(也就是可以被正确解析)。

日历事件

所谓"日历事件"是指可以同时表达多个时间戳的一种特殊的表达式, 可以把它想象成一种专用于时间戳的正则表达式。 其语法是基于前述绝对时间戳语法的一种扩展。例如:

Thu,Fri 2012-*-1,5 11:12:13

表示: 2012年任意月份的1号或5号且为周三或周五的日子的11点12分13秒

"星期"部分是可选的。若指定, 则必须使用英文三字母缩写(例如"Wed")或英文全称(例如"Wednesday"), 大小写无关。可以使用 "," 依次列出多个日子, 也可以使用 ".." 表示一个范围, 还可以将多个范围( ".." )用 "," 依次列出。

对于"年-月-日"与"时:分:秒"两部分中的 每个子部分都可以使用 "*" 表示匹配任意值、 使用","依次列出多个值、使用 ".." 表示一个范围、 使用"/整数"表示以此整数为间隔不断向后重复跳跃 (例如在表示分钟的部分"3/10"等价于"3,13,23,33,43,53")。 最后,还可以将多个重复("/")用与范围("..")用","依次列出。

注意,"秒"部分比较特殊,可以使用十进制小数以表示更高的精度(最多六位小数), 例如"3.33/10.05"等价于"3.33,13.38,23.43,33.48,43.53,53.58"。

若省略了"年-月-日"则等价于当前日期; 若省略了"时:分:秒"则等价于"00:00:00"; 若省略了":秒"则等价于":00"

时区部分与时间戳一样,要么必须省略,要么必须丝毫不差的设为"UTC"三个大写字母。 省略时区表示使用本机时区,而设为"UTC"则表示使用世界统一时间(相当于格林威治时间)。

特殊的日历事件关键字 "minutely"(每分钟), "hourly"(每小时), "daily"(每天), "monthly"(每月), "weekly"(每周), "yearly"(每年), "quarterly"(每季度), "semiannually"(每半年) 的精确定义 分别是: "*-*-* *:*:00", "*-*-* *:00:00", "*-*-* 00:00:00", "*-*-01 00:00:00", "Mon *-*-* 00:00:00", "*-01-01 00:00:00", "*-01,04,07,10-01 00:00:00", "*-01,07-01 00:00:00"

下面是一些日历事件实例及其标准化形式:

   Sat,Thu,Mon..Wed,Sat..Sun → Mon..Thu,Sat,Sun *-*-* 00:00:00
     Mon,Sun 12-*-* 2,1:23 → Mon,Sun 2012-*-* 01,02:23:00
                   Wed *-1 → Wed *-*-01 00:00:00
           Wed..Wed,Wed *-1 → Wed *-*-01 00:00:00
                Wed, 17:48 → Wed *-*-* 17:48:00
Wed..Sat,Tue 12-10-15 1:2:3 → Tue..Sat 2012-10-15 01:02:03
               *-*-7 0:0:0 → *-*-07 00:00:00
                     10-15 → *-10-15 00:00:00
       monday *-12-* 17:00 → Mon *-12-* 17:00:00
 Mon,Fri *-*-3,1,2 *:30:45 → Mon,Fri *-*-01,02,03 *:30:45
      12,14,13,12:20,10,30 → *-*-* 12,13,14:10,20,30:00
           12..14:10,20,30 → *-*-* 12,13,14:10,20,30:00
 mon,fri *-1/2-1,3 *:30:45 → Mon,Fri *-01/2-01,03 *:30:45
            03-05 08:05:40 → *-03-05 08:05:40
                  08:05:40 → *-*-* 08:05:40
                     05:40 → *-*-* 05:40:00
    Sat,Sun 12-05 08:05:40 → Sat,Sun *-12-05 08:05:40
          Sat,Sun 08:05:40 → Sat,Sun *-*-* 08:05:40
          2003-03-05 05:40 → 2003-03-05 05:40:00
05:40:23.4200004/3.1700005 → 05:40:23.420000/3.170001
            2003-02..04-05 → 2003-02,03,04-05 00:00:00
      2003-03-05 05:40 UTC → 2003-03-05 05:40:00 UTC
                2003-03-05 → 2003-03-05 00:00:00
                     03-05 → *-03-05 00:00:00
                    hourly → *-*-* *:00:00
                     daily → *-*-* 00:00:00
                 daily UTC → *-*-* 00:00:00 UTC
                   monthly → *-*-01 00:00:00
                    weekly → Mon *-*-* 00:00:00
                    yearly → *-01-01 00:00:00
                  annually → *-01-01 00:00:00
                     *:2/3 → *-*-* *:02/3:00

定时器单元会使用日历事件,详见 systemd.timer(5) 手册。

参见

systemd(1), journalctl(1), systemd.timer(5), systemd.unit(5), systemd.directives(7)