#日期-时间 #日程 #调度器 #日期 #时间 #日历 #编解码器

无 std chrono-light

Rust 的轻量级 DateTime/scheduler 库,兼容 no_std

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

MIT/Apache

85KB
785

简单的 DateTime/Scheduler 库

test

提供 DateTimeSchedule 功能,无外部库依赖。在 std/no std 中工作,可选支持 scale codec 编码/解码/类型信息。

提供的功能

  • 从 unixtime(纪元以来的毫秒)转换为 DateTime,反之亦然
  • 查找由以下组成的计划的下一次发生时间
    • 开始 DateTime
    • 重复频率(年/月/周/天/小时/分钟/秒/毫秒的倍数)
    • 可选的结束 DateTime
  • scale 功能启用对 DateTime/Schedule 结构体的 Encode/Decode/TypeInfo 支持的 scale 特性。

范围

此库适用于 [1970, 4000] 年内的 DateTimeschedule

不支持时区。

月份(>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