5 个不稳定版本

0.7.5 2024年4月21日
0.7.1 2023年10月14日
0.7.0 2022年9月17日
0.5.0 2021年1月12日
0.4.2 2019年1月21日

#44 in 日期和时间


islamic-os-lib使用

MIT 许可协议

120KB
2.5K SLoC

Salah

Build Status Crate.io Docs

用法

将以下内容添加到您的 Cargo.toml 文件的 [dependencies] 部分

[dependencies]
salah = "0.7.5"

要获取祈祷时间,使用 PrayerSchedule 结构体,传递坐标、日期和计算参数。

use salah::prelude::*;

let new_york_city = Coordinates::new(40.7128, -74.0059);
let date          = NaiveDate::from_ymd_opt(2019, 1, 25).expect("Invalid date provided");
let params        = Configuration::with(Method::MoonsightingCommittee, Madhab::Hanafi);
let prayers       = PrayerSchedule::new()
                      .on(date)
                      .for_location(new_york_city)
                      .with_configuration(params)
                      .calculate();

初始化参数

坐标

创建一个 Coordinates 结构体,其中包含您想要获取祈祷时间的位置的纬度和经度。

let coordinates = Coordinates::new(40.7128, -74.0059);

日期

为了避免与时区混淆,传递的日期参数应该是 Date<Utc> 的实例。需要填写年、月和日组件。其他所有组件将被忽略。

let date = Utc.ymd(2019, 1, 25);

配置

祈祷时间的计算需要某些信息。可以使用 Configuration 结构体来配置这些信息,这是底层 Parameters 结构体的构建器。可以通过传递 Method 枚举的一个变体(以下将介绍可用的变体)以及 Madhab 枚举的一个变体来初始化此结构体。如果需要,您可以进一步自定义计算参数。

let params = Configuration::with(Method::NorthAmerica, Madhab::Hanafi);
参数 描述
method 使用的 CalculationMethod 枚举中的哪个预设。默认值为 other
fajr_angle 用于计算 Fajr 的太阳在水平线下的角度。
maghrib_angle 用于计算 Maghrib 的太阳在水平线下的角度,用于某些计算方法。
isha_angle 用于计算 Isha 的太阳在水平线下的角度。
isha_interval Maghrib 后的分钟数(如果设置,Isha 的时间将是 Maghrib 加上 isha_interval)。
madhab 用于计算 Asr 的 Madhab 枚举中的哪个设置。
high_latitude_rule 用于计算 Fajr 最小时间和 Isha 最大时间的 HighLatitudeRule 枚举中的哪个设置。
adjustments 带有为每个祈祷时间自定义的分钟数调整的 PrayerAdjustments 结构体。
rounding 对祈祷时间的舍入行为。可以是最近的分钟,更高的分钟,或无。
shafaq 由月亮观测委员会方法用于确定如何计算伊沙的时间。下面是值的解释。

方法

为计算祷告时间提供了一些权威预设配置。

描述
穆斯林世界联盟 穆斯林世界联盟。标准法吉尔时间,角度为18°。较早的伊沙时间,角度为17°。
埃及 埃及测量总局。使用19.5°角度的早期法吉尔时间,以及使用17.5°角度的稍早伊沙时间。
卡拉奇 卡拉奇伊斯兰科学大学。一种普遍适用的方法,使用标准法吉尔和伊沙角度为18°。
乌姆·阿尔·库拉 麦加乌姆·阿尔·库拉大学。使用从夕起到伊沙的固定间隔90分钟来计算伊沙时间。以及一个稍早的法吉尔时间,角度为18.5°。 注意:在斋月期间,你应该为伊沙添加+30分钟的自定义调整。
迪拜 在阿联酋使用。法吉尔时间略早,伊沙时间略晚,法吉尔和伊沙的角度为18.2°,另外日出、晡时、正午、夕时的偏移量为3分钟。
卡塔尔 ummAlQura相同的伊沙间隔,但使用18°角度的标准法吉尔时间。
科威特 标准法吉尔时间,角度为18°。伊沙时间稍早,角度为17.5°。
月亮观测委员会 由全球月亮观测委员会创始人Khalid Shaukat开发的方法。除了季节调整值外,法吉尔和伊沙使用标准的18°角度。此方法自动应用高于55°纬度的1/7近似规则。推荐用于北美和英国。
新加坡 在新加坡、马来西亚和印度尼西亚使用。法吉尔时间较早,角度为20°,伊沙时间标准,角度为18°。
土耳其 土耳其迪亚尼特方法的一个近似。此近似在土耳其地区外准确性较低。
德黑兰 德黑兰大学地球物理研究所。伊沙时间较早,角度为14°,法吉尔时间稍晚,角度为17.7°。基于太阳达到地平线以下4.5°角度计算夕时。
北美 也称为ISNA方法。可用于北美,但月亮观测委员会方法更佳。提供较晚的法吉尔时间和较早的伊沙时间,角度为15°。
其他 默认角度为0°,通常用于创建自定义方法并设置自己的值。

教法学派

晡时祷告时间的设置。对于哈纳菲教法学派,晡时比沙菲教法学派稍晚。

描述
沙菲 较早的晡时时间(适用于沙菲、马立基、哈纳菲和贾法里)
哈纳菲 较晚的晡时时间

高纬度规则

用于近似高纬度法吉尔和伊沙的规则。

描述
午夜时分 法吉尔不会早于夜半,伊沙不会晚于夜半。这是默认值,以防止法吉尔和伊沙交叉边界。
夜晚第七部分 法吉尔永远不会早于夜晚最后第七部分的开头,伊沙永远不会晚于夜晚第一第七部分的结尾。这建议用于纬度高于48°的地区,以防止难以进行的祷告时间。
黄昏角度 夜晚被分为大约1/3的部分。确切值是通过将法吉尔/伊沙角度除以60得到的。这可以用于防止某些位置的困难法吉尔和伊沙时间。

你可以通过调用recommended(coordinates:)函数并传递位置的坐标来获取某个位置的推荐高纬度规则。

let myCoordinates = Coordinates { latitude: 48.983226, longitude: -3.216649 };
let highLatRule = HighLatitudeRule::recommended(myCoordinates);

沙发

沙发由月亮观测委员会方法用于确定用于确定伊沙时间的黄昏类型。

描述
一般 “通用”是Ahmer和Abyad的结合。这是默认值,将为高纬度地区的位置提供更合理的时间。
Ahmer Ahmer表示黄昏是天空中的红色光芒。被Shafi、Maliki和Hanbali学派使用。这通常会产生更早的Isha时间。
Abyad Abyad表示黄昏是天空中的白色光芒。被Hanafi学派使用。这通常会产生更晚的Isha时间。

祈祷时间表

PrayerSchedule》结构是一个用于构建《PrayerTimes》结构的构建器。一旦对其调用《calculate》方法,就会初始化一个《PrayerTime》结构,并包含所有五个祈祷时间、日出时间和Qiyam祈祷的时间。

祈祷时间将是一个《DateTime》的实例,并因此指代一个固定的时间点。要显示当地时区的这些时间,您需要使用适当的本地时区格式化它们。

此结构提供了方便的方法来简化祈祷时间的使用和显示。

PrayerTime

方法 描述
name() 返回以英语转写的祈祷者名称。
time(prayer:Prayer) 以《DateTime》返回祈祷时间。有关操作返回值的说明,请参阅《DateTime》文档。
current() 返回当前祈祷的《Prayer`类型。
next() 返回下一个祈祷的《Prayer`类型。
time_remaining() 返回一个元组,其中第一个元素是小时,第二个元素是分钟。该值始终在当前祈祷的上下文中。

Prayer

这是一个枚举,具有所有祈祷的变体,包括日出Qiyam。为此类型提供的方法只有一个,即name方法,它将返回以英语转写的祈祷名称。

完整示例

use salah::prelude::*;

let new_york_city = Coordinates::new(40.7128, -74.0059);
let date          = Utc.ymd(2019, 1, 25);
let params        = Configuration::with(Method::NorthAmerica, Madhab::Hanafi);
let prayers       = PrayerSchedule::new()
                        .on(date)
                        .for_location(new_york_city)
                        .with_configuration(params)
                        .calculate();

match prayers
{
    Ok(prayer) => {
        println!("{}: {}", Prayer::Fajr.name(), prayer.time(Prayer::Fajr).format("%-l:%M %p").to_string());
        println!("{}: {}", Prayer::Sunrise.name(), prayer.time(Prayer::Sunrise).format("%-l:%M %p").to_string());
        println!("{}: {}", Prayer::Dhuhr.name(), prayer.time(Prayer::Dhuhr).format("%-l:%M %p").to_string());
        println!("{}: {}", Prayer::Asr.name(), prayer.time(Prayer::Asr).format("%-l:%M %p").to_string());
        println!("{}: {}", Prayer::Maghrib.name(), prayer.time(Prayer::Maghrib).format("%-l:%M %p").to_string());
        println!("{}: {}", Prayer::Isha.name(), prayer.time(Prayer::Isha).format("%-l:%M %p").to_string());
        println!("{}: {}", Prayer::Qiyam.name(), prayer.time(Prayer::Qiyam).format("%-l:%M %p").to_string());
    },
    Err(error) => println!("Could not calculate prayer times: {}", error)
}

输出将是在UTC时间(

Fajr: 10:53 AM
Sunrise: 12:12 PM
Dhuhr: 5:09 PM
Asr: 8:24 PM
Maghrib: 10:05 PM
Isha: 11:24 PM
Qiyam: 6:37 AM

便利工具

PrayerTimes`》结构具有获取当前祈祷和下一个祈祷的功能。您还可以获取指定祈祷的时间,这使得动态显示直到下一个祈祷的倒计时变得更容易。

...
let prayers = PrayerSchedule::new()
                .on(date)
                .for_location(new_york_city)
                .with_configuration(params)
                .calculate();
let (hours, minutes) = prayers.current().time_remaining();

println!("Current: {} ({}:{})", prayers.current().name, hours, minutes);
println!("Next prayer is {} at {}.", prayers.next().name, prayers.time(prayer.next()).format("%-l:%M %p").to_string()));

朝向Qibla的方向

获取从给定坐标集得到的Qibla方向,以度为单位从北开始。

let new_york_city   = Coordinates::new(40.7128, -74.0059);
let qiblah_direction = Qiblah::new(new_york_city);

println!("Qiblah: {}", qibla_direction); //  Outputs: Qiblah: 58.4817

要获取Qibla方向的实数值(f64),您可以在《Qiblah`》实例上使用《value`方法。

let new_york_city   = Coordinates::new(40.7128, -74.0059);
let qiblah_direction = Qiblah::new(new_york_city);

println!("Qiblah: {}", qibla_direction.value()); //  Outputs: Qiblah: 58.48176358718943

贡献

有关更多信息,请参阅《CONTRIBUTING.md`文件。

行为准则

我们的贡献者行为准则可以在《code-of-conduct.md`文件中找到。

致谢

此库基于Batoul Apps的《Adhan`库。所有天文计算都是直接来自Jean Meeus的《Astronomical Algorithms`一书中高精度方程。

许可证

Salah遵循三个条款的BSD许可协议。这意味着:只要Salah的版权依然存在,条件未被修改,免责声明存在,你可以随意使用它。此外,未经书面同意,不得使用作者的名字来推广软件的衍生产品。

完整的许可协议文本可以在LICENSE文件中找到。

依赖项

~1MB
~18K SLoC