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 日期和时间
233 每月下载量
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