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 日期和时间
120KB
2.5K SLoC
Salah
用法
将以下内容添加到您的 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