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 回复
        
      
      
        
        
      
                    
                  
                    

