#date #calendar

bdays

Business Days calendars for Rustaceans

2 releases

0.0.2 Dec 18, 2018
0.0.1 Nov 26, 2018

#24 in Date and time

13 downloads per month

MIT license

63KB
898 lines

bdays

License bdays on Travis CI bdays on crates.io bdays on docs.rs

Provides functions to perform business days calculation between dates, given a Holiday Calendar.

A Business Day is defined as a weekday that is not a holiday.

To check if a date is a holiday, you must provide an implementation of the HolidayCalendar trait.

This crate is a port of BusinessDays.jl to the Rust programming language.

Provided Holiday Calendars

This crate provides a set of built-in holiday calendars in the bdays::calendars submodule.

  • bdays::calendars::WeekendsOnly : accounts only weekends

  • bdays::calendars::brazil::BRSettlement : Brazilian banking holidays

  • bdays::calendars::brazil::BrazilExchange : BMF&BOVESPA Exchange holidays (http://www.bmfbovespa.com.br)

  • bdays::calendars::us::USSettlement : United States federal holidays

Usage

extern crate bdays;
extern crate chrono;

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

// 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

As a motivation, this example might take some time to finish.

extern crate bdays;
extern crate chrono;

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);
}

You can use HolidayCalendarCache to perform fast business days calculation for a given range of dates.

extern crate bdays;
extern crate chrono;

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);
}

Dependencies

~746KB