6 个版本
0.1.5 | 2022年7月6日 |
---|---|
0.1.4 | 2022年6月26日 |
0.1.2 | 2022年5月30日 |
0.1.0 | 2022年4月18日 |
#341 in 日期和时间
85KB
785 行
简单的 DateTime/Scheduler 库
提供 DateTime
和 Schedule
功能,无外部库依赖。在 std/no std 中工作,可选支持 scale codec 编码/解码/类型信息。
提供的功能
- 从 unixtime(纪元以来的毫秒)转换为
DateTime
,反之亦然 - 查找由以下组成的计划的下一次发生时间
- 开始
DateTime
- 重复频率(年/月/周/天/小时/分钟/秒/毫秒的倍数)
- 可选的结束
DateTime
- 开始
scale
功能启用对DateTime
/Schedule
结构体的Encode/
Decode/
TypeInfo
支持的scale
特性。
范围
此库适用于 [1970, 4000] 年内的 DateTime
和 schedule
。
不支持时区。
月份(>12)、日期(>28、>30、>31)、小时(>23)、分钟/秒(>59)、毫秒(>999)的溢出是不推荐的但允许的,多余的数值将被加到例如 31 月份相当于 1 月份。月份/日期的下溢(=0)将导致 panic。为了避免 panic,请通过 Calendar::validate()
验证手工制作的 DateTime
或通过 Calendar::to_unixtime_opt()
转换为 unixtime。
这些限制背后的原因是保持占用空间合理紧凑并保持性能合理快速,并适应现实生活场景。
典型用法
use chrono_light::prelude::*;
let c = Calendar::create();
let now_in_ms: u64 = 1650412800000; // represents 20/04/2022 00:00:00:000
let schedule = Schedule {
start: DateTime { year: 2020, month: 4, day: 30, hour: 0, minute: 0, second: 0, ms: 0 },
items: vec![(Frequency::Year, 1)],
end: Some(DateTime { year: 2025, month: 4, day: 30, hour: 0, minute: 0, second: 0, ms: 0 })
};
assert!(c.validate_schedule(&schedule).is_ok());
assert_eq!(Some(10*24*60*60*1000), c.next_occurrence_ms(&c.from_unixtime(now_in_ms), &schedule)); // triggers in 10 days
组件中的实用工具
Chrono-light
作为 scheduler-pallet 的调度机制。
依赖
~0–580KB
~12K SLoC