5 个版本

0.2.4 2022年11月14日
0.2.3 2022年5月24日
0.2.1 2021年1月24日
0.2.0 2020年10月17日
0.1.0 2020年6月20日

#85日期和时间

Download history 1856/week @ 2024-04-23 973/week @ 2024-04-30 1727/week @ 2024-05-07 1769/week @ 2024-05-14 1446/week @ 2024-05-21 2529/week @ 2024-05-28 2699/week @ 2024-06-04 2463/week @ 2024-06-11 2654/week @ 2024-06-18 1860/week @ 2024-06-25 1938/week @ 2024-07-02 1829/week @ 2024-07-09 2907/week @ 2024-07-16 1814/week @ 2024-07-23 1687/week @ 2024-07-30 1763/week @ 2024-08-06

8,363 每月下载量
11 个Crates中使用 (直接使用 3 个)

BSD-2-Clause

71KB
1.5K SLoC

gregorian docs tests

一个格里高利历的实现,与ISO 8601兼容。这意味着日历在1年之前有一个0年。

此创建不处理时间或时区。

Date 类型表示日期(年、月和日),Year 类型表示日历年,Month 类型表示日历月,YearMonth 类型表示特定年份的月份。

尽可能将事物实现为 const fn。目前,这不包括特性和依赖于特性的函数。

示例

use gregorian::{Date, Month::*, Year, YearMonth};

assert!(Year::new(2020).has_leap_day(), true);
assert!(YearMonth::new(1900, February).total_days() == 28);
assert!(YearMonth::new(2000, February).total_days() == 29);

assert!(Year::new(2020).with_month(March).first_day() == Date::new(2020, March, 1).unwrap());
assert!(Year::new(2020).with_month(March).last_day() == Date::new(2020, March, 31).unwrap());

assert!(Year::new(2020).first_day() == Date::new(2020, 1, 1).unwrap());
assert!(Year::new(2020).last_day() == Date::new(2020, 12, 31).unwrap());

assert!(Date::new(2020, 2, 1).unwrap().day_of_year() == 32);

四舍五入无效日期

当您使用 Date::add_years()Date::add_months() 方法时,可能会得到无效日期。这些错误会以 InvalidDayOfMonth 错误的形式报告,该错误具有 next_valid()prev_valid() 方法。这些方法可以用来获取下一个或前一个有效日期。

此外,还有一个扩展特质为 Result<Date, InvalidDayOfMonth> 提供了 or_next_valid()or_prev_valid() 方法。这允许您直接在 Result 对象上对日期进行舍入。

use gregorian::{Date, DateResultExt};
let date = Date::new(2020, 1, 31).unwrap();
assert!(date.add_months(1).or_next_valid() == Date::new(2020, 3, 1).unwrap());
assert!(date.add_months(1).or_prev_valid() == Date::new(2020, 2, 29).unwrap());

依赖项

~180KB