| Crates.io | jp-holidays-lib |
| lib.rs | jp-holidays-lib |
| version | 1.0.1 |
| created_at | 2025-03-30 14:12:11.297578+00 |
| updated_at | 2025-05-01 11:58:14.388281+00 |
| description | Japanese holiday library for working with public holiday data in Rust. |
| homepage | |
| repository | https://github.com/46ki75/jp-holidays |
| max_upload_size | |
| id | 1612405 |
| size | 76,668 |
内閣府の公開する 「国民の祝日」について より 祝日判定機能を提供するクレートです。
以下のコマンドでクレートを追加してください。
cargo add jp-holidays-lib
日付操作に chrono を使用しているため、こちらも追加してください。
cargo add chrono
また、任意の非同期ランタイムも追加してください。ドキュメントでは tokio を使用しています。
cargo add tokio --features=full
使用例のコードがリポジトリの examples/ 以下に格納されています。
最初にクライアントを初期化します。この際、内閣府のオリジンに祝日のデータが格納された CSV を取得します。
let client = jp_holidays_lib::client::Client::init().await?;
その後は以下の例のように使用してください。 Rust の日付操作のデファクトスタンダードである chrono をベースに API が提供されています。
use chrono::NaiveDate;
use jp_holidays_lib::client::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::init().await?;
// 祝日を取得
let date = NaiveDate::from_ymd_opt(1955, 11, 23).ok_or("存在しない日付です".to_string())?;
let maybe_holiday = client.get_holiday(date);
match maybe_holiday {
Some(holiday) => println!("1955年 11月 23日 は{}", holiday),
None => println!("1955年 11月 23日 は祝日ではありません"),
};
// 祝日かどうか確認
let date = NaiveDate::from_ymd_opt(1956, 3, 21).ok_or("存在しない日付です".to_string())?;
let is_holiday = client.is_holiday(date);
println!(
"1956 3月 21日 は{}",
if is_holiday {
"祝日です"
} else {
"祝日ではありません"
}
);
Ok(())
}
Client が提供する関数は以下の通りです。
init(): クライアントを初期化します。get_holiday(): chrono::NaiveDate を渡して祝日を取得します。get_holiday_ymd(): 年月日を渡して祝日を取得します。is_holiday(): chrono::NaiveDate を渡して祝日かどうかを判定します。is_holiday_ymd(): 年月日を渡して祝日かどうかを判定します。is_day_off(): chrono::NaiveDate を渡して休日かどうかを判定します。is_day_off_ymd.(): 年月日を渡して休日かどうかを判定します。list_holidays(): 公開されている祝日をすべて取得します (BTreeMap<NaiveDate, String>)非同期ランタイムに tokio を使用している場合、以下のようにキャッシュを活用できます。
祝日のデータが格納された CSV をキャッシュできます。
use chrono::NaiveDate;
use jp_holidays_lib::{client::Client, error::Error};
// Client::init() は非同期に内閣府から祝日情報を取得するため、
// tokio::sync::OnceCell を使って初回のみ初期化し、その後はキャッシュを使用します。
static CACHE: tokio::sync::OnceCell<Client> = tokio::sync::OnceCell::const_new();
// キャッシュされた Client インスタンスを取得します
async fn get_client() -> Result<&'static Client, Error> {
CACHE.get_or_try_init(Client::init).await
}
// 実行用の関数(main から呼び出し)
// スコープを抜けても Client はキャッシュされ続けます
async fn execute() -> Result<(), Box<dyn std::error::Error>> {
let client = get_client().await?;
// 祝日を取得
let date = NaiveDate::from_ymd_opt(1955, 11, 23).ok_or("存在しない日付です".to_string())?;
let maybe_holiday = client.get_holiday(date);
match maybe_holiday {
Some(holiday) => println!("1955年 11月 23日 は{}", holiday),
None => println!("1955年 11月 23日 は祝日ではありません"),
};
// 祝日かどうか確認
let date = NaiveDate::from_ymd_opt(1956, 3, 21).ok_or("存在しない日付です".to_string())?;
let is_holiday = client.is_holiday(date);
println!(
"1956 3月 21日 は{}",
if is_holiday {
"祝日です"
} else {
"祝日ではありません"
}
);
Ok(())
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
for i in 0..5 {
let start = std::time::Instant::now();
execute().await?;
let duration = start.elapsed();
println!("{}回目の実行時間: {:?}\n", i + 1, duration);
}
Ok(())
}