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 在 日期和时间
1,934 每月下载
在 3 个 Crates 中使用 (直接使用 2 个)
96KB
2.5K SLoC
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 地区一样实现;即回退到常规的。- 最小字段宽度(应适用于
C、F、G、Y)和标志(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版(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或https://open-source.org.cn/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您有意提交并包含在作品中的任何贡献,如Apache-2.0许可证中定义,应如上双重授权,没有任何额外的条款或条件。
依赖关系
~1–1.5MB
~31K SLoC