#日期-时间 #simd #日期 #时间 #内核 #rfc-3339

packedtime-rs

用于高效存储、解析、格式化和截断时间戳的实用工具

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 日期和时间

Download history 1589/week @ 2024-04-08 2200/week @ 2024-04-15 697/week @ 2024-04-22 1223/week @ 2024-04-29 2424/week @ 2024-05-06 1752/week @ 2024-05-13 1551/week @ 2024-05-20 900/week @ 2024-05-27 820/week @ 2024-06-03 1114/week @ 2024-06-10 664/week @ 2024-06-17 1586/week @ 2024-06-24 1088/week @ 2024-07-01 551/week @ 2024-07-08 223/week @ 2024-07-15 369/week @ 2024-07-22

2,237 每月下载量

Apache-2.0 OR BSD-3-Clause

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_truncdate_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 相同的打包布局。

无运行时依赖项