11 个版本
0.3.1 | 2023年11月3日 |
---|---|
0.3.0 | 2023年11月1日 |
0.2.6 | 2023年7月3日 |
0.2.5 | 2023年4月17日 |
0.1.1 | 2022年7月26日 |
#46 in 日期和时间
2,237 每月下载量
88KB
2K SLoC
打包时间-RS
用于高效存储、解析、格式化和截断时间戳的实用工具
- 使用与
i64
(PackedTimestamp
) 相同布局的位打包时间戳表示。每个时间戳组件使用最少的位数,为分钟范围内的任意时区偏移留下足够的位数,以及从 -9999 到 9999 年的足够范围。如果时间戳仅用于解析、格式化或比较,则这是一种有用的存储格式。 - 使用 rfc 3339 格式 的 SIMD 优化解析和格式化函数。在微基准测试中,这些函数比使用 chrono 快 ~20 倍。
- 截断时间戳到年、月、季度、周或日精度的优化函数。当在以数组作为输入和输出的计算内核中使用这些函数时,它们比 chrono 快 2x-3x。
用法
解析时间戳
当为目标支持 SSE 指令编译时,解析使用 SSE 指令。当毫秒使用 3 位数字且时区为 UTC 时,有一个特殊的快速路径。如果没有 SSE,则使用手写的递归下降解析器。
assert_eq!(
"2022-08-21T17:30:15.250Z".parse(),
Ok(PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 250))
);
assert_eq!(
"2022-08-21T17:30:15.25Z".parse(),
Ok(PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 250))
);
assert_eq!(
"2022-08-21 17:30:15.1Z".parse(),
Ok(PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 100))
);
assert_eq!(
"2022-08-21 17:30:15Z".parse(),
Ok(PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 0))
);
格式化时间戳
请注意,格式化当前忽略时区偏移,并始终以 Z
作为偏移写入。
毫秒始终包含并使用 3 位数字打印。
assert_eq!(
PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 100).to_string(),
"2022-08-21T17:30:15.100Z".to_owned()
);
assert_eq!(
PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 123).to_string(),
"2022-08-21T17:30:15.123Z".to_owned()
);
assert_eq!(
PackedTimestamp::new_utc(2022, 8, 21, 17, 30, 15, 250).to_string(),
"2022-08-21T17:30:15.250Z".to_owned()
);
时间戳内核
date_trunc
和 date_add_month
内核的编写方式使得编译器可以在循环中使用时自动向量化。
assert_eq!(date_trunc_year_timestamp_millis(1658765238_000), 1640995200_000);
assert_eq!(date_trunc_month_timestamp_millis(1658765238_000), 1656633600_000);
assert_eq!(date_add_month_timestamp_millis(1661102969_000, 1), 1663718400_000);
assert_eq!(date_add_month_timestamp_millis(1661102969_000, 12), 1692576000_000);
包 net.jhorstmann:packedtime 实现了与 Java 相同的打包布局。