#calendar #date #localization #badi #bahai

badi-date

提供巴迪历(巴哈伊历)的日期以及巴迪历和公历日期之间的转换

7个版本

0.2.5 2024年7月21日
0.2.4 2024年7月21日
0.2.3 2024年6月6日
0.1.0 2024年6月5日

#76 in 日期和时间

Download history 400/week @ 2024-06-01 36/week @ 2024-06-08 2/week @ 2024-06-15 209/week @ 2024-07-20 24/week @ 2024-07-27

233 每月下载量

MIT 许可证

71KB
1.5K SLoC

badi-date

一个Rust crate,为Rust语言提供公历和巴迪历(巴哈伊历)之间的类型和转换。

变更日志

查看CHANGELOG.md了解0.1 -> 0.2的破坏性更改。

这个crate还在开发中,其API可能会更改!它似乎在初始测试中工作正常。尚未测试边缘情况。

安装

cargo add [email protected]

使用方法

(见 example/ 文件夹。)

cargo new test_badi_date
cd test_badi_date
cargo add [email protected]
cargo add [email protected]
cargo add [email protected]
cargo add [email protected]

main.rs

use badi_date::{
    BadiDate, BadiMonth, BahaiHolyDay, Coordinates, FromDateTime, HolyDayProviding, LocalBadiDate,
    ToDateTime,
};
use chrono::TimeZone;
use chrono_tz::Tz;
use now::TimeZoneNow;

fn main() {
    // Replace with your timezone / WGS84 GPS coordinates
    let denver: Tz = "America/Denver".parse().unwrap();
    // ATTENTION! Setting `coordinates` to `None` will return fallback time `badi_date::statics::START_OF_DAY_FALLBACK`
    let coords = Some(Coordinates::new(39.613319, -105.016647).unwrap());

    // Test a specific date/time before actual sunset
    let date = denver.with_ymd_and_hms(2024, 3, 19, 18, 0, 0).unwrap();
    let badi_date = LocalBadiDate::from_datetime(date, coords).unwrap();
    assert_eq!(
        LocalBadiDate::new(180, BadiMonth::Month(19), 19, denver, coords).unwrap(),
        badi_date,
    );
    println!("date: {:?}\nbadi_date: {:?}", date, badi_date);

    // Test a dynamic date/time
    let now = denver.now();
    let badi_now = LocalBadiDate::from_datetime(now, coords).unwrap();
    assert!(badi_now.start() <= now && badi_now.end() >= now);
    println!(
        "now: {:?}\nbadi_now: {:?}\nstart: {:?}\nend: {:?}",
        now,
        badi_now,
        badi_now.start(),
        badi_now.end()
    );

    // Test fallback conversion (no coordinates)
    let badi_fallback = LocalBadiDate::from_datetime(date, None).unwrap();
    assert_eq!(
        LocalBadiDate::new(181, BadiMonth::Month(1), 1, denver, None).unwrap(),
        badi_fallback,
    );
    println!("date: {:?}\nbadi_fallback: {:?}", date, badi_fallback);

    // Declaration of the Báb
    let declaration = BadiDate::new(181, BadiMonth::Month(4), 8).unwrap();
    assert_eq!(
        declaration.holy_day(),
        Some(BahaiHolyDay::DeclarationOfTheBab),
    );
    assert_eq!(declaration.holy_day().unwrap().work_suspended(), true);

    let naw_ruz = BadiDate::new(182, BadiMonth::Month(1), 1).unwrap();
    let ascension = naw_ruz.previous_holy_day().unwrap();
    assert_eq!(
        ascension,
        BadiDate::new(181, BadiMonth::Month(14), 6).unwrap()
    );
    assert_eq!(
        ascension.holy_day(),
        Some(BahaiHolyDay::AscensionOfAbdulBaha),
    );
    assert_eq!(ascension.holy_day().unwrap().work_suspended(), false);
}

欢迎贡献/反馈

  • 待办事项:添加CONTRIBUTING.md文件

欢迎在有趣的位置提供贡献/反馈/ 测试用例。请告诉我,如果任何文档不清晰。

这个crate遵循MIT许可证,因此,通过提交问题或拉取请求,你同意你的贡献也携带此许可证,并成为本项目的公共部分。

背景

巴哈伊历,也称为巴迪历,是一个 太阳历,通过19个月每月19天来简化年份,有4或5个闰日称为Ayyám-i-Há,位于第18个月和第19个月之间,从1844年3月21日日落开始,即新年Naw-Rúz。

每个巴哈伊/巴迪日从当地时间日落开始(因此,与其他日历一样,一天的开始是从东到西“滚动”的)。在极北和南极纬度的情况下,白天开始由时钟固定(通常是18:00 **)。此crate包括计算给定纬度、经度和时区的当地时间日落时间。

  • 待办事项:**检查有关固定时钟时间的指导并更新 statics::START_OF_DAY_FALLBACK 如有必要

当前巴哈伊纪元(B.E.)年可以通过从当前公历年中减去1844(在Naw-Rúz之前)或1843(在Naw-Rúz之后)来计算。另一种方法

bahai_year = current_gregorian_year - 1844
if current_date >= naw_ruz_of_current_gregorian_year
    bahai_year = bahai_year + 1

Ayyám-i-Há(闰日)固定在每巴迪年的第342天开始,因此Ayyám-i-Há之前的月份和日期按以下方式计算

badi_month = 1 + (day_of_badi_year - 1) / 19
badi_day = 1 + (day_of_badi_year - 1) % 19

和Ayyám-i-Há之后的日期如下

badi_month = 19
badi_day = day_of_badi_year - (342 + number_of_days_in_ayyamiha)

“新年Naw-Rúz在太阳进入白羊座的那一天,即使这发生在日落前不到一分钟。” —— 巴哈欧拉

纳吾鲁孜节在伊朗德黑兰(巴哈欧拉诞生地)的春分日日出和日落之间。由于格里历并非真正的太阳历,纳吾鲁孜节每年在3月20日至21日之间变动。

“在每一个时代采用新的历法是神圣启示重塑人类对物质、社会和精神性现实的感知力量的象征。通过它,神圣的时刻被区分,人类在时空中的位置被重新构想,生活的节奏被重塑。” —— 世界正义院,2014年7月10日

其他语言的等效包

感谢以下作者为他们的工作提供了灵感/贡献了此crate

语言 作者
JavaScript / TypeScript badidate @janrg
Dart / Flutter badi_date @Soroosh

依赖项

~9–19MB
~242K SLoC