#日期-时间 #时间格式化 #时间解析器 #规范 #兼容性 #日期解析 #strftime

time-fmt

为 time-rs 提供类似 strftime/strptime 的日期时间格式化/解析器

18 个版本

0.3.8 2022 年 10 月 17 日
0.3.7 2022 年 5 月 26 日
0.3.5 2022 年 4 月 22 日
0.3.4 2022 年 3 月 12 日
0.1.7 2022 年 3 月 6 日

#52日期和时间

Download history 536/week @ 2024-03-13 521/week @ 2024-03-20 540/week @ 2024-03-27 414/week @ 2024-04-03 462/week @ 2024-04-10 411/week @ 2024-04-17 639/week @ 2024-04-24 566/week @ 2024-05-01 550/week @ 2024-05-08 580/week @ 2024-05-15 744/week @ 2024-05-22 431/week @ 2024-05-29 437/week @ 2024-06-05 464/week @ 2024-06-12 541/week @ 2024-06-19 416/week @ 2024-06-26

1,934 每月下载
3 个 Crates 中使用 (直接使用 2 个)

MIT/Apache

96KB
2.5K SLoC

CI crates.io

time-fmt

这是一个用于格式化/解析 time crate 日期时间的库,拥有与 strftime/strptime 兼容的格式规范。

除非有特殊情况,否则您应该使用 time crate 的格式

特性

  • 类似 ANSI/ISO C 的 strftime 函数。
    • %C, %d, %D, %e, %F, %g, %G, %h, %H, %I, %j, %k, %l, %m, %M, %n, %R, %S, %t, %T, %u, %U, %V, %w, %W, %y, %Y, %%.
    • 视为C/POSIX地区的情况: %a%A%b%B%c%p%P%r%x%X
    • 可用性(参见:不兼容性部分): %z%Z
  • POSIX C strptime 类函数。
    • %C%d%D%e%F%h%H%I%j%k%l%m%M%n%R%S%t%T%W%y%Y%%
    • 视为C/POSIX地区的情况: %b%B%c%p%P%r%x%X
    • 可用但处理解析值的方式委托给用户: %z%Z
    • 解析(视为C/POSIX地区)但被忽略的: %a%A%U%w
  • strftime 类转换说明转换为时间 crate 的 Vec<FormatItem> 的函数。
  • strptime 类转换描述转换为时间 crate 的 Vec<FormatItem> 的函数。

尚未实现功能。欢迎贡献!

  • 测试不佳。显然需要更多的测试。
  • 不支持将格式说明编译为中间表示。请将它们转换为 Vec<FormatItem>
  • %E*%O* 应当像在 C/POSIX 地区一样实现;即回退到常规的。
  • 最小字段宽度(应适用于 CFGY)和标志(0+)。

不兼容性/注意事项

  • strftime 类似项
    • 这些需要查找nl_langinfo,即%a%A%b%h%B%c%p%P%r%x%X尚未实现此功能。相反,它们被硬编码为使用C/POSIX区域设置。
    • 基于时代的格式,即以%E开头的格式不受支持。
    • 备选的数字符号,即以%O开头的符号不受支持。
    • %z在传递PrimitiveDateTime时不起作用。它将被替换为空字符串,就像“无法确定时区”一样。
    • %Z仅在您使用了接受时区名称的函数时才起作用。否则,将被替换为空字符串,就像“无法确定时区”一样。
    • 跟在一个不支持转换指定符的字符后面的%将导致错误。
  • 类似strptime
    • 年份必须适合4个字节,即不支持在年份-999之前或在年份9999之后。
    • 星期几指定符,一年中的星期指定符,即%a%A%U%w与输入匹配,但被忽略。
    • 由于我们的日期/时间表示结构不是类似于C语言中的struct tm,不一致的输入将导致不确定的行为。
      • 例如,可以指定月份、月份中的日期和一年中的日期。但如果一年中的日期与(月份,月份中的日期)对不匹配,则不清楚要做什么。目前它选择一年中的日期,将来可能会改为执行其他操作,例如在未来的版本中返回Result::Err,而不会增加主版本号。
    • %z%Z提供的偏移量/时区信息不会反映到返回的日期时间中。相反,我们返回一个PrimitiveDateTime和解析的偏移量/时区名称的对。
      • 如果为%z提供了Z,它将被视为与+00:00相同。
  • 将类似strftime的转换指定符转换为Vec<FormatItem>
    • %C(世纪)和%Z(时区名称)不受支持,因为没有对应的FormatItem
  • 将类似strptime的转换描述转换为Vec<FormatItem>
    • %C(世纪)和%Z(时区名称)不受支持,因为没有对应的FormatItem
    • %z(时区指定符)不能是Z,因为我们似乎不能通过FormatItem来实现。
    • 空白字符不会占用超过一个空白字符,因为FormatItem中没有重复。

示例

use time::{macros::{datetime, offset}, UtcOffset};
use time_fmt::{format::*, parse::*};

let dt = datetime!(2022-03-06 12:34:56);

// Format primitive date time
assert_eq!(
    format_date_time("%Y-%m-%d %H:%M:%S", dt).unwrap(),
    "2022-03-06 12:34:56"
);
// Format offset date time
assert_eq!(
    format_offset_date_time("%Y-%m-%d %H:%M:%S %z", dt.assume_offset(offset!(+9:00))).unwrap(),
    "2022-03-06 12:34:56 +0900"
);
// With timezone_name feature
assert_eq!(
    format_zoned_date_time("%Y-%m-%d %H:%M:%S %Z", dt, offset!(+9:00), "JST").unwrap(),
    "2022-03-06 12:34:56 JST"
);
// Parse date time
assert_eq!(
    parse_date_time_maybe_with_zone("%Y-%m-%d %H:%M:%S %z", "2022-03-06 12:34:56 +0900")
    .unwrap(),
    (
        dt,
        Some(TimeZoneSpecifier::Offset(
                UtcOffset::from_hms(9, 0, 0).unwrap()
        ))
    )
);

发布新版本

备注

$ git switch master                 # make sure you're on the master branch
$ cargo release patch               # to dry-run the release
$ cargo release patch --execute     # to actually execute the release

许可证

在以下任一许可证下授权:

由您选择。

贡献

除非您明确声明,否则您有意提交并包含在作品中的任何贡献,如Apache-2.0许可证中定义,应如上双重授权,没有任何额外的条款或条件。

依赖关系

~1–1.5MB
~31K SLoC