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或http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您有意提交并包含在作品中的任何贡献,如Apache-2.0许可证中定义,应如上双重授权,没有任何额外的条款或条件。
依赖关系
~1–1.5MB
~31K SLoC