Rust日期处理库bdays的使用,高效计算生日、纪念日及周期性日期管理
Rust日期处理库bdays的使用,高效计算生日、纪念日及周期性日期管理
以下是内容中提供的示例代码:
基本使用示例
use chrono::NaiveDate;
use bdays::HolidayCalendar;
fn main() {
// 创建假日日历实例
let cal = bdays::calendars::WeekendsOnly;
let d0 = NaiveDate::from_ymd(2018, 11, 22);
let d1 = NaiveDate::from_ymd(2018, 11, 24);
let d2 = NaiveDate::from_ymd(2018, 11, 26);
// 检查日期是否为假日
assert_eq!(cal.is_holiday(d0), false);
// 检查日期是否为工作日
assert_eq!(cal.is_bday(d0), true);
assert_eq!(cal.is_bday(d1), false);
// 调整到上一个/下一个工作日
assert_eq!(cal.to_bday(d1, false), NaiveDate::from_ymd(2018, 11, 23));
assert_eq!(cal.to_bday(d1, true), d2);
// 前进若干工作日
assert_eq!(cal.advance_bdays(d0, 2), d2);
assert_eq!(cal.advance_bdays(d2, -2), d0);
// 返回两个日期之间的工作日数量
assert_eq!(cal.bdays(d0, d2), 2);
assert_eq!(cal.bdays(d2, d0), -2);
}
HolidayCalendarCache示例
use chrono::NaiveDate;
use bdays::HolidayCalendar;
let cal = bdays::HolidayCalendarCache::new(
bdays::calendars::brazil::BRSettlement,
NaiveDate::from_ymd(1980, 1, 1),
NaiveDate::from_ymd(2100, 12, 31)
);
let d0 = NaiveDate::from_ymd(2001, 2, 1);
let d1 = NaiveDate::from_ymd(2100, 2, 1);
for _i in 0..30 {
cal.bdays(d0, d1);
}
完整示例demo
use chrono::NaiveDate;
use bdays::HolidayCalendar;
fn main() {
// 使用只考虑周末的日历
let cal = bdays::calendars::WeekendsOnly;
// 假设生日是2020年2月20日
let birthday = NaiveDate::from_ymd_opt(2020, 2, 20).unwrap();
// 计算10个工作日后的日期
let after_10_bdays = cal.advance_bdays(birthday, 10);
println!("10个工作日后是: {}", after_10_bdays);
// 计算2020年2月20日到2020年3月20日之间的工作日数量
let end_date = NaiveDate::from_ymd_opt(2020, 3, 20).unwrap();
let bdays_count = cal.bdays(birthday, end_date);
println!("{}到{}之间有{}个工作日", birthday, end_date, bdays_count);
// 检查特定日期是否为工作日
let check_date = NaiveDate::from_ymd_opt(2020, 2, 22).unwrap(); // 周六
println!("{}是工作日吗? {}", check_date, cal.is_bday(check_date));
// 调整到最近的工作日
let adjusted_date = cal.to_bday(check_date, true); // 调整为下一个工作日
println!("调整后的工作日是: {}", adjusted_date);
}
更完整的周期性日期管理示例
use chrono::{NaiveDate, Duration};
use bdays::{HolidayCalendar, HolidayCalendarCache};
use bdays::calendars::us::USSettlement;
// 周期性日期管理函数
fn calculate_periodic_dates(
start_date: NaiveDate,
end_date: NaiveDate,
interval_days: i64,
cal: &impl HolidayCalendar
) -> Vec<NaiveDate> {
let mut current_date = start_date;
let mut result = Vec::new();
while current_date <= end_date {
result.push(current_date);
current_date = cal.advance_bdays(current_date, interval_days);
}
result
}
fn main() {
// 使用美国假日日历
let cal = HolidayCalendarCache::new(
USSettlement,
NaiveDate::from_ymd_opt(2000, 1, 1).unwrap(),
NaiveDate::from_ymd_opt(2030, 12, 31).unwrap()
);
// 纪念日计算
let anniversary = NaiveDate::from_ymd_opt(2020, 5, 15).unwrap();
let today = NaiveDate::from_ymd_opt(2023, 5, 1).unwrap();
// 计算纪念日之间的工作日
let work_days = cal.bdays(anniversary, today);
println!("从纪念日到今天之间有{}个工作日", work_days);
// 计算未来10个周期性日期(每30个工作日一次)
let periodic_dates = calculate_periodic_dates(
today,
NaiveDate::from_ymd_opt(2024, 5, 1).unwrap(),
30,
&cal
);
println!("未来的周期性日期:");
for date in periodic_dates {
println!("- {}", date);
}
}
这个库特别适合需要精确计算工作日的应用场景,如金融、人力资源和项目管理等领域。通过使用不同的假日日历,可以适应不同国家或地区的特殊假日安排。
1 回复