#日期-时间 #日期 #紧凑 #密集 #打包 #时间

neat-date-time

(原生) 提供空间高效存储日期和时间的类型与操作

3 个不稳定版本

0.2.0 2023年7月14日
0.1.9 2022年12月23日
0.1.8 2022年6月17日
0.1.7 2022年5月23日

#9 in #密集

Download history 7/week @ 2024-03-13 24/week @ 2024-03-27 47/week @ 2024-04-03

每月 下载次数 75
用于 reactive-mutiny

无许可证

30KB
322

neat-date-time 包

neat-date-time GitHub Actions neat-date-time on crates.io neat-date-time on docs.rs

日期和时间的密集且可序列化的表示,提供原生类型和操作以实现空间高效存储。

浏览 文档

问题陈述

Rust 的 std(以及 chrono 库)提供了通用的日期和时间结构,这意味着它们提供了

  • 通用范围
  • 通用精度

为了这种通用性,需要付出存储成本。因此,对于特定领域需求,可以通过调整这两个属性来优化空间。

应用示例

以股票市场为例。交易可以按每日集进行分组,而单个交易将在交易时段的开市和收市之间发生。可能的优化包括

  • 日期范围:通过使用单个 u16,我们能够表示约179年的时间——通过使用纪元日期,任何 stdchrono 日期都可以转换为 u16 并反向转换;
  • 时间范围与精度:这里有两个选项:使用完整的24小时范围(尽可能高的精度)或使用部分范围——比如说,12小时——精度是其两倍。如果我们用u32表示时间,24小时范围将允许大约20.117µs的精度(或者更精确地,1/((2^32)/86400)*1e6µs)。另一方面,如果我们想要精确到10µs的精度,一个u32可以表示11:55:49.67296秒(从公式s*1e6 / (2^32) = µs_precision得出,这相当于s=(2^32)/1e5

优化分析

  • std::time::Duration使用96位——u32只是它的1/3;
  • chronoNaiveDate使用i32——u16将其减半。

包含日期、时间、8个字符的资产、u32单价和u32数量的交易记录将需要原始大小的68.75%——即16/11的关系。

如果按资产和日期分组交易,优化后的版本将只需要原始大小的60%。

此外,通过允许将日期和时间表示为原生整数类型,可以辅助序列化。

使用示例

时间

#![allow(uncommon_codepoints)]
use neat_date_time::neat_time;

let (h, m, s, ms, µs) = (17, 32, 42, 937, 3);
let expected_duration = std::time::Duration::from_micros(µs+(ms+(s+(m+h*60)*60)*1000)*1000);
let u32_duration = neat_time::u32_from_24h_duration(&expected_duration);
dbg!(u32_duration);
let observed_duration = neat_time::duration_from_24h_u32(u32_duration);
assert_eq!(observed_duration, expected_duration, "std duration <--> u32 conversions failed");

u32日期

use neat_date_time::neat_date;

let (original_year, original_month, original_day) = (1979, 01, 22);
let epoch = neat_date::u32_from_ymd(original_year as u16, original_month as u8, original_day as u8);
dbg!(epoch);
let (reconstructed_year, reconstructed_month, reconstructed_day) = neat_date::ymd_from_u32(epoch);
assert_eq!((reconstructed_year, reconstructed_month, reconstructed_day), (original_year, original_month, original_day), "naive dates <--> u32 conversions failed");

注意

这是第一个版本,只是从现有代码中重构出来的。下一个版本将有一个更好的API以供通用。

目前,u16日期可以表示为从u32日期的偏移量:只需将u16日期加到或从u32绝对日期中即可。

无运行时依赖