#时间 #日期时间 #systemd #chrono #日期

chrono-systemd-time

将systemd.time风格的时戳解析为chrono类型库

2个不稳定版本

0.3.0 2023年12月1日
0.1.0 2018年9月27日

#64日期和时间

Download history 95/week @ 2024-04-08 69/week @ 2024-04-15 256/week @ 2024-04-22 475/week @ 2024-04-29 240/week @ 2024-05-06 640/week @ 2024-05-13 245/week @ 2024-05-20 208/week @ 2024-05-27 186/week @ 2024-06-03 114/week @ 2024-06-10 78/week @ 2024-06-17 89/week @ 2024-06-24 283/week @ 2024-07-01 394/week @ 2024-07-08 255/week @ 2024-07-15 55/week @ 2024-07-22

994 每月下载量
3 crates 中使用

MIT/Apache

52KB
988

chrono systemd.time

crates.io docs.rs Build & Test lint

该库将符合systemd.time规范的时戳解析为chrono类型。

时戳格式

支持的时戳格式包括systemd.time规范中定义的所有格式,但有少数例外

  • 时间单位 必须 伴随所有时间跨度值。
  • 不支持时区后缀。
  • 不支持星期前缀。

时戳的格式可以是时间、时间跨度,或者时间 +/- 时间跨度的组合。

  • 当只给出时间时,返回解析的时间。
  • 当只给出时间跨度时,从当前时间(现在)添加或减去时间跨度。
  • 当给出时间和时间跨度的组合时,从解析的时间添加或减去时间跨度。

以下为解析有效时戳的示例,假设现在为2018-06-21 01:02:03

    parse_timestamp_tz("2018-08-20 09:11:12.123", Utc) == "2018-08-20T09:11:12.000123Z"
    parse_timestamp_tz("2018-08-20 09:11:12", Utc) == "2018-08-20T09:11:12Z"
    parse_timestamp_tz("18-08-20 09:11:12 +2m", Utc) == "2018-08-20T09:13:12Z"
    parse_timestamp_tz("2018-08-20 + 1h2m3s", Utc) == "2018-08-20T01:02:03Z"
    parse_timestamp_tz("18-08-20 - 1h 2m 3s", Utc) == "2018-08-19T22:57:57Z"
    parse_timestamp_tz("09:11:12 -1day", Utc) == "2018-06-20T09:11:12Z"
    parse_timestamp_tz("09:11:12.123", Utc) == "2018-06-21T09:11:12.000123Z"
    parse_timestamp_tz("11:12", Utc) == "2018-06-21T11:12:00Z"
    parse_timestamp_tz("now", Utc) == "2018-06-21T01:02:03.203918151Z"
    parse_timestamp_tz("today", Utc) == "2018-06-21T00:00:00Z"
    parse_timestamp_tz("yesterday -2days", Utc) == "2018-06-18T00:00:00Z"
    parse_timestamp_tz("tomorrow +1week", Utc) == "2018-06-29T00:00:00Z"

    parse_timestamp_tz("epoch +1529578800s", Utc) == "2018-06-21T11:00:00Z"
    parse_timestamp_tz("@1529578800s", Utc) == "2018-06-21T11:00:00Z"
    parse_timestamp_tz("now +4h50m", Utc) == "2018-06-21T05:52:03.203918151Z"
    parse_timestamp_tz("4h50m left", Utc) == "2018-06-21T05:52:03.203918151Z"
    parse_timestamp_tz("+4h50m", Utc) == "2018-06-21T05:52:03.203918151Z"
    parse_timestamp_tz("now -3s", Utc) == "2018-06-21T01:02:00.203918151Z"
    parse_timestamp_tz("3s ago", Utc) == "2018-06-21T01:02:00.203918151Z"
    parse_timestamp_tz("-3s", Utc) == "2018-06-21T01:02:00.203918151Z"

时间

时间的语法由一组关键字和strftime格式组成

  • "now", "epoch"
  • "today", "yesterday", "tomorrow"
  • "%y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M:%S"
  • "%y-%m-%d %H:%M", "%Y-%m-%d %H:%M"
  • "%y-%m-%d""%Y-%m-%d"
  • "%H:%M:%S"
  • "%H:%M"

包含秒数的strftime时间戳也可以包含微秒数,由'.'分隔。

  • 省略日期时,默认为今天。
  • 省略时间时,默认为00:00:00。

有效时间的示例(假设当前时间为2018-06-21 01:02:03)

    "2018-08-20 09:11:12.123" == "2018-08-20T09:11:12.000123"
        "2018-08-20 09:11:12" == "2018-08-20T09:11:12"
          "18-08-20 09:11:12" == "2018-08-20T09:11:12"
                 "2018-08-20" == "2018-08-20T00:00:00"
                   "18-08-20" == "2018-08-20T00:00:00"
                   "09:11:12" == "2018-06-21T09:11:12"
               "09:11:12.123" == "2018-06-21T09:11:12.000123"
                      "11:12" == "2018-06-21T11:12:00"
                        "now" == "2018-06-21T01:02:03.203918151"
                      "epoch" == "1970-01-01T00:00:00"
                      "today" == "2018-06-21T00:00:00"
                  "yesterday" == "2018-06-20T00:00:00"
                   "tomorrow" == "2018-06-22T00:00:00"

时间跨度

时间跨度由以下时间单位组合而成,以下时间单位被理解

  • "usec""us""µs"
  • "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天)

时间跨度的所有部分相加。

有效时间跨度的示例

          "3hours" == Duration::hours(3)
           "2d 5h" == Duration::days(2) + Duration::hours(5)
    "1y 10 months" == Duration::years(1) + Duration::months(10)
          "30m22s" == Duration::minutes(30) + Duration::seconds(22)
       "10m 2s 5m" == Duration::minutes(15) + Duration::seconds(2)
        "10d 2 5m" == Duration::days(10) + Duration::minutes(25)

依赖关系

~1MB
~18K SLoC