#calendar #scheduling #date

dayendar

Dayendar - 高级日历操作库

2 个版本

0.1.2 2023年10月21日
0.1.1 2023年10月12日
0.1.0 2023年10月12日

#515 in 数据结构

Apache-2.0

505KB
4.5K SLoC

Dayendar = Days + Calendar

描述

Rust库,用于高级且高效的日历操作。

Version Rust Report Card dependency status codecov

为什么选择Dayendar

有三个原因

  • 目前还没有使用DaysCalendar结构进行日历操作的开源、完整库。这使得它成为一个独特且宝贵的解决方案。
  • 它提供了标准库中不可用的高级日历操作算子和实用工具。
  • 它的DaysCalendar表示和数据结构针对常见的日历任务(如合并、过滤、查找日期等)进行了优化。

功能

  • DaysCalendar的灵活日历表示允许以不同形式(BiDay、Day等)建模日期。
  • 强大的算子,可以有效地合并和转换日历。允许从简单的日历创建复杂的日历。
  • 高级按ISO周、星期几等过滤。适用于日程安排、可用性等应用程序。
  • 包含用于规范化、反转、查找前后日期的实用工具,便于进行常见的日历操作。
  • 使用Rust设计,注重性能和安全。使用Vec、HashSet、BTreeMap等数据结构提供效率。
  • 良好的文档,带有文档注释。易于理解和扩展。
  • 开源,可以检查和贡献实现。

安装

使用Rust Cargo

cargo add dayendar

或将以下行添加到您的Cargo.toml文件中

[dependencies]
dayendar = "0.1.2"

用法

use dayendar::types::{Month, BiDay};
use dayendar::calendar::{DaysCalendar, replicate};

fn main() {

    let pattern: [BiDay; 2] = [BiDay::One, BiDay::Zero]; // pattern: One day on, the next day off.
    
    let my_calendar = replicate::<BiDay>(&pattern, DaysCalendar::singleton
        ( 2024, Month::January
        ).unwrap()
    );

    println!("\n {:?}\n", my_calendar);

}

示例

案例:确定John在2023年1月应该上班的日期。John通常在星期一和星期四上班。他应该避免老板有董事会会议的日期。还要考虑2023年1月30日和31日的黑客马拉松日。

使用Struct DaysCalendar的Rust解决方案:

use dayendar::types::{Month, Weekday};
use dayendar::calendar::{
    DaysCalendar,
    from_day,
    biday_to_vec_day
};
use std::collections::HashSet;

fn main() {
    // Days of the week John usually comes to the office.
    let mut john_work_days = HashSet::new();
    john_work_days.insert(Weekday::Monday);
    john_work_days.insert(Weekday::Thursday);

    // Days when John's boss has board meetings.
    let boss_meeting_days = vec![(2023, Month::January, vec![9, 11, 13, 16, 23, 24, 28])];
    let boss_meetings_calendar = from_day(
        DaysCalendar {
            days_calendar: boss_meeting_days
        }
    );

    // Hackathon days in January 2023.
    let hackathon_days = from_day(
        DaysCalendar {
            days_calendar: vec![(2023, Month::January, vec![30, 31])]
        }
    );

    // Determine John's office days considering his workdays, boss's meeting days, and hackathon days.
    let john_office_days = DaysCalendar::singleton(2023, Month::January).unwrap()
      .and_weekdays(john_work_days)
      .minus(&boss_meetings_calendar)
      .minus(&hackathon_days);

    // Convert the final calendar to a vector of days.
    let office_days_list = biday_to_vec_day(john_office_days.clone());
    
    println!("\nJohn's Office Days in January 2023:\n {:?}\n", office_days_list);
}

要查看更多示例,请探索项目的"examples"文件夹,或简单地运行

cargo run --example <example_name>

文档

完整文档可在https://docs.rs/dayendar找到

贡献

与我们合作,欢迎您

欢迎提交PR!请在提交任何重大更改之前先打开一个问题来讨论。

如果您想为"Dayendar"的开发做出贡献,我们鼓励您这样做!

请在提交更改之前阅读在CONTRIBUTING中定义的贡献指南,阅读我们的治理指南GOBERNANCE和我们的行为准则CODE_OF_CONDUCT

请注意,贡献必须签名。在执行commit时通过添加-S选项来签名提交

git commit -S -m "Your comment"

重要:为了签署您的贡献,您需要设置一个GPG密钥,并按照《生成GPG密钥》文档中的说明配置Git。

我们正在寻找新的维护者

如果您想成为Dayendar维护团队的一员,请在《OWNERS.md》文档中提交一个PR,并留下您的详细信息。我们会尽快与您联系。

许可协议

本项目遵循Apache 2.0 许可协议。这是一个广泛用于开源软件项目的许可协议。它允许用户以任何方式使用、修改和分发软件,只要他们遵守许可协议设定的条件。有关更多信息,请参阅Apache 2.0 许可协议的官方页面。

依赖项

~1MB
~22K SLoC