#date #holidays #date-time #time

holidays

Rust 库,提供基于 Python holidays 包的准确且最新的节假日日期

1 个不稳定版本

0.1.0 2023 年 2 月 2 日

日期和时间 中排名第 297

每月下载 39

自定义许可

7MB
102K SLoC

holidays-rs

设计

python-holidays 是一个维护良好的包,用于动态生成节假日。另一方面,本库不是将 python-holidays 转移到 Rust,而是使用 python-holidays 的脚本静态生成节假日的 Rust 代码。由于本库的节假日数据库简化为一个线程安全的 HashMap(存在单线程使用选项),因此它在大多数情况下都非常快且灵活。

为了保持节假日数据库的新鲜性,我们计划使用 Github Actions 任务来自动

  1. 使用脚本通过最新的 python-holidays 生成代码
  2. 构建和运行测试
  3. 如果有任何更改,它将增加版本并发布到 crates.io

使用方法

最简单的使用方法是调用 holidays::init 来在线程安全的 HashMap 中初始化节假日数据库。节假日数据库初始化后,您可以调用 holidays::contains 来检查指定日期是否为节假日。调用 holidays::get 生成一个包含国家代码、国家名称、日期和节假日名称的对象。

use chrono::NaiveDate;
use holidays::Country;

fn main() -> anyhow::Result<()> {
    holidays::init()?;

    let d = NaiveDate::from_ymd_opt(2022, 1, 1).expect("Invalid date");
    println!("Is {d} a holiday in Japan? Answer is {}", holidays::contains(Country::JP, d)?);
    println!("{:?}", holidays::get(Country::JP, d)?.unwrap());

    Ok(())
}

注意,holidays::init 会将所有支持的国家和年份的节假日加载到内存中,所以它相当重。 如果您需要某些国家和年份的节假日,请考虑使用 holidays::Builder 来限制它们。

holidays::Builder::new()
        .countries(&[Country::JP])
        .years(2022..2023)
        .init()?;

如果您在编译时知道需要哪些国家,您可以在 Cargo.toml 中指定国家代码。这可以显着提高构建性能。

holidays = { version = "*", default-features = false, features = ["JP"] }

支持的国家和年份

holidays-rs 支持 2000 年至 2023 年以下链接中列出的国家。

https://github.com/dr-prodigy/python-holidays#available-countries

常见问题解答

  • 问题:我如何在单线程环境中使用此库?
  • 不要调用 initholidays::Builderinit 方法。相反,你可以通过调用 holidays::Builderbuild 方法来获取内部的 HashMap。

致谢

非常感谢 python-holidays 贡献者 维护这样一个优秀的包!🙏

许可证

本项目采用 MIT 许可证

依赖项

~1.3–2MB
~37K SLoC