7个版本

0.1.4 2024年5月12日
0.1.3 2022年4月21日
0.1.2 2021年1月29日
0.1.1 2019年9月15日
0.0.1 2018年11月26日

#31 in 日期和时间

Download history 2285/week @ 2024-05-04 2291/week @ 2024-05-11 2147/week @ 2024-05-18 2082/week @ 2024-05-25 2340/week @ 2024-06-01 2150/week @ 2024-06-08 2101/week @ 2024-06-15 2251/week @ 2024-06-22 1788/week @ 2024-06-29 2363/week @ 2024-07-06 2703/week @ 2024-07-13 2575/week @ 2024-07-20 2649/week @ 2024-07-27 2017/week @ 2024-08-03 2036/week @ 2024-08-10 1786/week @ 2024-08-17

8,889 个月下载量
用于 2 个包

MIT 许可证

105KB
1.5K SLoC

bdays

License CI docs version

提供在给定节假日日历的情况下计算日期之间工作日的函数。

商务日被定义为非节假日的平日。

要检查日期是否为节假日,你必须提供一个 HolidayCalendar 特质的实现。

此包是从 BusinessDays.jl 翻译到Rust编程语言的。

提供的节假日日历

此包在 bdays::calendars 子模块中提供一组内置的节假日日历。

  • bdays::calendars::WeekendsOnly : 仅计算周末

  • bdays::calendars::brazil::BRSettlement : 巴西银行节假日

  • bdays::calendars::brazil::BrazilExchange : B3交易所节假日 (http://www.b3.com.br)

  • bdays::calendars::us::USSettlement : 美国联邦节假日

使用方法

将这些依赖项添加到您的 Cargo.toml 文件中。

[dependencies]
bdays = "0.1"
chrono = "0.4"

以下示例展示了此包的基本功能。

use chrono::NaiveDate;
use bdays::HolidayCalendar;

fn main() {
    // creates a holiday calendar instance
    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);

    // checks if a date is a holiday
    assert_eq!( cal.is_holiday(d0), false );

    // checks if a date is a business day
    assert_eq!( cal.is_bday(d0), true  );
    assert_eq!( cal.is_bday(d1), false );

    // adjusts to the last/next business day
    assert_eq!( cal.to_bday(d1, false), NaiveDate::from_ymd(2018, 11, 23) );
    assert_eq!( cal.to_bday(d1, true) , d2 );

    // advances a number of business days
    assert_eq!( cal.advance_bdays(d0,  2), d2 );
    assert_eq!( cal.advance_bdays(d2, -2), d0 );

    // returns the number of business days between dates
    assert_eq!( cal.bdays(d0, d2),  2);
    assert_eq!( cal.bdays(d2, d0), -2);
}

HolidayCalendarCache

作为一个激励,这个例子可能需要一些时间才能完成。

use chrono::NaiveDate;
use bdays::HolidayCalendar;

let cal = bdays::calendars::brazil::BRSettlement;
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);
}

您可以使用 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);
}

依赖项

~1MB
~18K SLoC