1个不稳定版本
0.1.0 | 2024年7月7日 |
---|
#770 在 数据结构
11KB
107 行
我们通常使用64位类型来表示二级UNIX时间戳。这提供了极大的范围,超过29.2亿年。这在对内存使用敏感的场景中是浪费的。然而,使用32位类型,则可以提供136年的范围,这对于大多数应用来说已经足够。然而,考虑到UNIX时间戳从1970年开始,这个范围从1970年到2106年。2106年似乎并不遥远,可能引起溢出问题。
如果我们能指定一个起始时间,比如应用的发布时间,我们就可以绕过1970年的限制。例如,如果一个应用在2024年发布,我们只需要从2024年及以后的戳记,那么通过使用2024作为起始点,我们可以表示从2024年到2160年的范围。在这里,2160年看起来更遥远也更安全。
此crate通过指定起始年份和使用32位类型来表示时间戳提供了一种简单的封装。
随着时间的推移,这个crate的价值将越来越明显。
示例
use epoch32::Epoch32;
type MyEpoch = Epoch32<2024>; // 2024-2160
assert_eq!(std::mem::size_of::<MyEpoch>(), 4); // 32-bits
println!("{}", MyEpoch::now()); // get current time, and show as UNIX Epoch
let ts1 = MyEpoch::try_from_unix_epoch(1719403339).unwrap(); // convert from UNIX Epoch
assert_eq!(ts1.to_unix_epoch(), 1719403339); // convert to UNIX Epoch
let ts2 = MyEpoch::try_from_unix_epoch(1719403349).unwrap();
let tensecs = std::time::Duration::from_secs(10);
assert!(ts1 < ts2); // compare
assert_eq!(ts1 + tensecs, ts2); // add duration
assert_eq!(ts2.duration_since(ts1), Some(tensecs)); // calulate diff duration
println!("{} {}", ts1, ts2);
功能
serde
启用serde特性和集成(Serialize
/Deserialize
)
依赖关系
~165KB