diff --git a/CHANGELOG.md b/CHANGELOG.md index 122b7cd..4101d39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## development +- update Kotlin to 1.9.20 +- new target: Linux arm64 +- support Turkish Diyanet method +- support Shafaq parameter +- support rounding, and update Singapore method to use up rounding +- update test data to [d418fb3](https://github.com/batoulapps/adhan-testdata/commit/d418fb37b3d011af5594e344c06c0e5616db2a5c). +- add a plethora of tests + ## version 0.0.4 - support macOS arm64, Linux X64, Windows X64, JS, and watchOS - update to Kotlin 1.7.10 diff --git a/Shared/Times/Ankara-Turkey.json b/Shared/Times/Ankara-Turkey.json new file mode 100644 index 0000000..cb7da2c --- /dev/null +++ b/Shared/Times/Ankara-Turkey.json @@ -0,0 +1,244 @@ +{ + "params": { + "latitude": 39.939382, + "longitude": 32.819713, + "timezone": "Europe/Istanbul", + "method": "Turkey", + "madhab": "Shafi", + "highLatitudeRule": "MiddleOfTheNight" + }, + "source": [ + "https://www.yenisafak.com/en/ankara-prayer-times-01.01.2019", + "2019-01-01 06:33 08:03 12:57 15:20 17:40 19:05", + "2019-02-01 06:25 07:51 13:07 15:49 18:14 19:34", + "2019-03-01 05:53 07:16 13:06 16:14 18:46 20:04", + "2019-04-01 05:01 06:27 12:58 16:31 19:19 20:39", + "2019-05-01 04:07 05:43 12:51 16:40 19:49 21:18", + "2019-06-01 03:24 05:15 12:51 16:48 20:17 22:00", + "2019-07-01 03:21 05:16 12:57 16:55 20:28 22:15", + "2019-08-01 03:58 05:40 13:00 16:53 20:10 21:45", + "2019-09-01 04:40 06:09 12:54 16:34 19:29 20:52", + "2019-10-01 05:14 06:37 12:44 16:02 18:40 19:58", + "2019-11-01 05:45 07:10 12:37 15:28 17:55 19:14", + "2019-12-01 06:14 07:43 12:42 15:10 17:31 18:55" + ], + "variance": 2, + "times": [ + { + "date": "2019-01-01", + "fajr": "6:33 AM", + "sunrise": "8:03 AM", + "dhuhr": "12:57 PM", + "asr": "3:20 PM", + "maghrib": "5:40 PM", + "isha": "7:05 PM" + }, + { + "date": "2019-01-15", + "fajr": "6:33 AM", + "sunrise": "8:02 AM", + "dhuhr": "1:03 PM", + "asr": "3:32 PM", + "maghrib": "5:54 PM", + "isha": "7:17 PM" + }, + { + "date": "2019-02-01", + "fajr": "6:25 AM", + "sunrise": "7:51 AM", + "dhuhr": "1:07 PM", + "asr": "3:49 PM", + "maghrib": "6:14 PM", + "isha": "7:34 PM" + }, + { + "date": "2019-02-15", + "fajr": "6:11 AM", + "sunrise": "7:35 AM", + "dhuhr": "1:08 PM", + "asr": "4:02 PM", + "maghrib": "6:30 PM", + "isha": "7:49 PM" + }, + { + "date": "2019-03-01", + "fajr": "5:53 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:06 PM", + "asr": "4:14 PM", + "maghrib": "6:46 PM", + "isha": "8:04 PM" + }, + { + "date": "2019-03-15", + "fajr": "5:31 AM", + "sunrise": "6:54 AM", + "dhuhr": "1:03 PM", + "asr": "4:23 PM", + "maghrib": "7:01 PM", + "isha": "8:19 PM" + }, + { + "date": "2019-04-01", + "fajr": "5:01 AM", + "sunrise": "6:27 AM", + "dhuhr": "12:58 PM", + "asr": "4:31 PM", + "maghrib": "7:19 PM", + "isha": "8:39 PM" + }, + { + "date": "2019-04-15", + "fajr": "4:35 AM", + "sunrise": "6:05 AM", + "dhuhr": "12:54 PM", + "asr": "4:35 PM", + "maghrib": "7:33 PM", + "isha": "8:56 PM" + }, + { + "date": "2019-05-01", + "fajr": "4:07 AM", + "sunrise": "5:43 AM", + "dhuhr": "12:51 PM", + "asr": "4:40 PM", + "maghrib": "7:49 PM", + "isha": "9:18 PM" + }, + { + "date": "2019-05-15", + "fajr": "3:44 AM", + "sunrise": "5:27 AM", + "dhuhr": "12:50 PM", + "asr": "4:43 PM", + "maghrib": "8:03 PM", + "isha": "9:39 PM" + }, + { + "date": "2019-06-01", + "fajr": "3:24 AM", + "sunrise": "5:15 AM", + "dhuhr": "12:51 PM", + "asr": "4:48 PM", + "maghrib": "8:17 PM", + "isha": "10:00 PM" + }, + { + "date": "2019-06-15", + "fajr": "3:17 AM", + "sunrise": "5:12 AM", + "dhuhr": "12:54 PM", + "asr": "4:51 PM", + "maghrib": "8:26 PM", + "isha": "10:12 PM" + }, + { + "date": "2019-07-01", + "fajr": "3:21 AM", + "sunrise": "5:16 AM", + "dhuhr": "12:57 PM", + "asr": "4:55 PM", + "maghrib": "8:28 PM", + "isha": "10:15 PM" + }, + { + "date": "2019-07-15", + "fajr": "3:35 AM", + "sunrise": "5:25 AM", + "dhuhr": "1:00 PM", + "asr": "4:56 PM", + "maghrib": "8:24 PM", + "isha": "10:06 PM" + }, + { + "date": "2019-08-01", + "fajr": "3:58 AM", + "sunrise": "5:40 AM", + "dhuhr": "1:00 PM", + "asr": "4:53 PM", + "maghrib": "8:10 PM", + "isha": "9:45 PM" + }, + { + "date": "2019-08-15", + "fajr": "4:18 AM", + "sunrise": "5:53 AM", + "dhuhr": "12:58 PM", + "asr": "4:46 PM", + "maghrib": "7:54 PM", + "isha": "9:22 PM" + }, + { + "date": "2019-09-01", + "fajr": "4:40 AM", + "sunrise": "6:09 AM", + "dhuhr": "12:54 PM", + "asr": "4:34 PM", + "maghrib": "7:29 PM", + "isha": "8:52 PM" + }, + { + "date": "2019-09-15", + "fajr": "4:57 AM", + "sunrise": "6:22 AM", + "dhuhr": "12:49 PM", + "asr": "4:20 PM", + "maghrib": "7:06 PM", + "isha": "8:26 PM" + }, + { + "date": "2019-10-01", + "fajr": "5:14 AM", + "sunrise": "6:37 AM", + "dhuhr": "12:44 PM", + "asr": "4:02 PM", + "maghrib": "6:40 PM", + "isha": "7:58 PM" + }, + { + "date": "2019-10-15", + "fajr": "5:28 AM", + "sunrise": "6:51 AM", + "dhuhr": "12:40 PM", + "asr": "3:46 PM", + "maghrib": "6:18 PM", + "isha": "7:36 PM" + }, + { + "date": "2019-11-01", + "fajr": "5:45 AM", + "sunrise": "7:10 AM", + "dhuhr": "12:37 PM", + "asr": "3:28 PM", + "maghrib": "5:55 PM", + "isha": "7:14 PM" + }, + { + "date": "2019-11-15", + "fajr": "5:59 AM", + "sunrise": "7:26 AM", + "dhuhr": "12:38 PM", + "asr": "3:16 PM", + "maghrib": "5:40 PM", + "isha": "7:02 PM" + }, + { + "date": "2019-12-01", + "fajr": "6:14 AM", + "sunrise": "7:43 AM", + "dhuhr": "12:42 PM", + "asr": "3:10 PM", + "maghrib": "5:31 PM", + "isha": "6:55 PM" + }, + { + "date": "2019-12-15", + "fajr": "6:25 AM", + "sunrise": "7:56 AM", + "dhuhr": "12:48 PM", + "asr": "3:10 PM", + "maghrib": "5:31 PM", + "isha": "6:56 PM" + } + ] +} \ No newline at end of file diff --git a/Shared/Times/Singapore-Singapore.json b/Shared/Times/Singapore-Singapore.json index 3069306..354c44d 100644 --- a/Shared/Times/Singapore-Singapore.json +++ b/Shared/Times/Singapore-Singapore.json @@ -1,136 +1,3308 @@ { "params": { - "latitude": 1.283333, - "longitude": 103.833333, + "latitude": 1.370844612058886, + "longitude": 103.80145644060552, "timezone": "Asia/Singapore", "method": "Singapore", "madhab": "Shafi", "highLatitudeRule": "MiddleOfTheNight" }, - "source": [ - "http://www.muis.gov.sg", - "adjusted +/- 2 minutes", - "1/1/2017 5:44-1 7:07-1 1:10-1 4:34-1 7:10-1 8:25-1", - "1/2/2017 5:57-1 7:17-1 1:20-1 4:41 7:21-1 8:33-1", - "1/3/2017 5:58-1 7:15-1 1:19-1 4:31 7:20 8:30-1", - "1/4/2017 5:48 7:05 1:10-1 4:15 7:13-1 8:22-1", - "1/5/2017 5:38-1 6:58-1 1:03 4:22 7:07 8:18", - "1/6/2017 5:34 6:57 1:04 4:29-1 7:10-2 8:23", - "1/7/2017 5:39 7:03 1:10 4:35 7:15-1 8:30-1", - "1/8/2017 5:46-1 7:06 1:13-1 4:34 7:17-1 8:29", - "1/9/2017 5:44-1 7:01 1:06 4:17 7:09 8:19-1", - "1/10/2017 5:35 6:52-1 12:56-1 4:03-1 6:58-1 8:07-1", - "1/11/2017 5:27 6:47-1 12:50-1 4:09 6:51-1 8:02-1", - "1/12/2017 5:30-1 6:53-1 12:55 4:19-1 6:56-1 8:10" - ], + "source": "http://www.muis.gov.sg", + "variance": 2, "times": [ - { - "date": "2016-01-01", - "fajr": "5:43 AM", - "sunrise": "7:06 AM", - "dhuhr": "1:09 PM", - "asr": "4:33 PM", - "maghrib": "7:09 PM", - "isha": "8:24 PM" - }, - { - "date": "2016-02-01", + { + "date": "2020-01-01", + "fajr": "5:44 AM", + "sunrise": "7:07 AM", + "dhuhr": "1:10 PM", + "asr": "4:34 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-01-02", + "fajr": "5:44 AM", + "sunrise": "7:08 AM", + "dhuhr": "1:10 PM", + "asr": "4:34 PM", + "maghrib": "7:11 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-01-03", + "fajr": "5:45 AM", + "sunrise": "7:08 AM", + "dhuhr": "1:11 PM", + "asr": "4:35 PM", + "maghrib": "7:11 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-01-04", + "fajr": "5:46 AM", + "sunrise": "7:09 AM", + "dhuhr": "1:11 PM", + "asr": "4:35 PM", + "maghrib": "7:12 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-01-05", + "fajr": "5:46 AM", + "sunrise": "7:09 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:12 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-01-06", + "fajr": "5:47 AM", + "sunrise": "7:10 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:13 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-01-07", + "fajr": "5:47 AM", + "sunrise": "7:10 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:13 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-01-08", + "fajr": "5:48 AM", + "sunrise": "7:10 AM", + "dhuhr": "1:13 PM", + "asr": "4:37 PM", + "maghrib": "7:14 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-01-09", + "fajr": "5:48 AM", + "sunrise": "7:11 AM", + "dhuhr": "1:14 PM", + "asr": "4:37 PM", + "maghrib": "7:14 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-01-10", + "fajr": "5:48 AM", + "sunrise": "7:11 AM", + "dhuhr": "1:14 PM", + "asr": "4:37 PM", + "maghrib": "7:14 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-01-11", + "fajr": "5:49 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:14 PM", + "asr": "4:38 PM", + "maghrib": "7:15 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-01-12", + "fajr": "5:49 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:15 PM", + "asr": "4:38 PM", + "maghrib": "7:15 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-01-13", + "fajr": "5:50 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:15 PM", + "asr": "4:38 PM", + "maghrib": "7:16 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-01-14", + "fajr": "5:50 AM", + "sunrise": "7:13 AM", + "dhuhr": "1:15 PM", + "asr": "4:39 PM", + "maghrib": "7:16 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-01-15", + "fajr": "5:51 AM", + "sunrise": "7:13 AM", + "dhuhr": "1:16 PM", + "asr": "4:39 PM", + "maghrib": "7:16 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-01-16", + "fajr": "5:51 AM", + "sunrise": "7:13 AM", + "dhuhr": "1:16 PM", + "asr": "4:39 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-01-17", + "fajr": "5:52 AM", + "sunrise": "7:14 AM", + "dhuhr": "1:16 PM", + "asr": "4:39 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-01-18", + "fajr": "5:52 AM", + "sunrise": "7:14 AM", + "dhuhr": "1:17 PM", + "asr": "4:40 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-01-19", + "fajr": "5:52 AM", + "sunrise": "7:14 AM", + "dhuhr": "1:17 PM", + "asr": "4:40 PM", + "maghrib": "7:18 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-01-20", + "fajr": "5:53 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:17 PM", + "asr": "4:40 PM", + "maghrib": "7:18 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-01-21", + "fajr": "5:53 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:18 PM", + "asr": "4:40 PM", + "maghrib": "7:18 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-01-22", + "fajr": "5:54 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:18 PM", + "asr": "4:40 PM", + "maghrib": "7:19 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-23", + "fajr": "5:54 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:18 PM", + "asr": "4:41 PM", + "maghrib": "7:19 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-24", + "fajr": "5:54 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:18 PM", + "asr": "4:41 PM", + "maghrib": "7:19 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-25", + "fajr": "5:55 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:19 PM", + "asr": "4:41 PM", + "maghrib": "7:19 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-26", + "fajr": "5:55 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:19 PM", + "asr": "4:41 PM", + "maghrib": "7:20 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-27", + "fajr": "5:55 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:19 PM", + "asr": "4:41 PM", + "maghrib": "7:20 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-28", "fajr": "5:56 AM", "sunrise": "7:16 AM", "dhuhr": "1:19 PM", "asr": "4:41 PM", "maghrib": "7:20 PM", "isha": "8:32 PM" - }, - { - "date": "2016-03-01", + }, + { + "date": "2020-01-29", + "fajr": "5:56 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:19 PM", + "asr": "4:41 PM", + "maghrib": "7:20 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-01-30", + "fajr": "5:56 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:20 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-01-31", + "fajr": "5:56 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-01", + "fajr": "5:57 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-02", + "fajr": "5:57 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-03", + "fajr": "5:57 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-04", + "fajr": "5:57 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-05", + "fajr": "5:57 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-06", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:41 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-07", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:40 PM", + "maghrib": "7:21 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-08", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:40 PM", + "maghrib": "7:22 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-09", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:40 PM", + "maghrib": "7:22 PM", + "isha": "8:33 PM" + }, + { + "date": "2020-02-10", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:21 PM", + "asr": "4:40 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-11", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:21 PM", + "asr": "4:39 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-12", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:21 PM", + "asr": "4:39 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-13", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:39 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-14", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:39 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-15", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:38 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-16", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:38 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-17", + "fajr": "5:59 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:37 PM", + "maghrib": "7:22 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-18", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:37 PM", + "maghrib": "7:21 PM", + "isha": "8:32 PM" + }, + { + "date": "2020-02-19", + "fajr": "5:58 AM", + "sunrise": "7:17 AM", + "dhuhr": "1:20 PM", + "asr": "4:37 PM", + "maghrib": "7:21 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-02-20", + "fajr": "5:58 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:20 PM", + "asr": "4:36 PM", + "maghrib": "7:21 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-02-21", + "fajr": "5:58 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:20 PM", + "asr": "4:36 PM", + "maghrib": "7:21 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-02-22", + "fajr": "5:58 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:20 PM", + "asr": "4:35 PM", + "maghrib": "7:21 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-02-23", + "fajr": "5:58 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:20 PM", + "asr": "4:35 PM", + "maghrib": "7:21 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-02-24", + "fajr": "5:58 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:19 PM", + "asr": "4:34 PM", + "maghrib": "7:21 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-02-25", + "fajr": "5:58 AM", + "sunrise": "7:16 AM", + "dhuhr": "1:19 PM", + "asr": "4:34 PM", + "maghrib": "7:21 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-02-26", + "fajr": "5:58 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:19 PM", + "asr": "4:33 PM", + "maghrib": "7:21 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-02-27", + "fajr": "5:58 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:19 PM", + "asr": "4:32 PM", + "maghrib": "7:21 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-02-28", + "fajr": "5:58 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:19 PM", + "asr": "4:32 PM", + "maghrib": "7:20 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-02-29", + "fajr": "5:58 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:19 PM", + "asr": "4:31 PM", + "maghrib": "7:20 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-03-01", + "fajr": "5:57 AM", + "sunrise": "7:15 AM", + "dhuhr": "1:18 PM", + "asr": "4:30 PM", + "maghrib": "7:20 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-03-02", "fajr": "5:57 AM", "sunrise": "7:14 AM", "dhuhr": "1:18 PM", - "asr": "4:31 PM", + "asr": "4:30 PM", + "maghrib": "7:20 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-03-03", + "fajr": "5:57 AM", + "sunrise": "7:14 AM", + "dhuhr": "1:18 PM", + "asr": "4:29 PM", + "maghrib": "7:20 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-03-04", + "fajr": "5:57 AM", + "sunrise": "7:14 AM", + "dhuhr": "1:18 PM", + "asr": "4:28 PM", "maghrib": "7:20 PM", "isha": "8:29 PM" - }, - { - "date": "2016-04-01", + }, + { + "date": "2020-03-05", + "fajr": "5:57 AM", + "sunrise": "7:14 AM", + "dhuhr": "1:18 PM", + "asr": "4:28 PM", + "maghrib": "7:19 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-03-06", + "fajr": "5:56 AM", + "sunrise": "7:13 AM", + "dhuhr": "1:17 PM", + "asr": "4:27 PM", + "maghrib": "7:19 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-03-07", + "fajr": "5:56 AM", + "sunrise": "7:13 AM", + "dhuhr": "1:17 PM", + "asr": "4:26 PM", + "maghrib": "7:19 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-03-08", + "fajr": "5:56 AM", + "sunrise": "7:13 AM", + "dhuhr": "1:17 PM", + "asr": "4:25 PM", + "maghrib": "7:19 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-03-09", + "fajr": "5:56 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:17 PM", + "asr": "4:24 PM", + "maghrib": "7:18 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-03-10", + "fajr": "5:55 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:16 PM", + "asr": "4:24 PM", + "maghrib": "7:18 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-03-11", + "fajr": "5:55 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:16 PM", + "asr": "4:23 PM", + "maghrib": "7:18 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-03-12", + "fajr": "5:55 AM", + "sunrise": "7:12 AM", + "dhuhr": "1:16 PM", + "asr": "4:22 PM", + "maghrib": "7:18 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-03-13", + "fajr": "5:55 AM", + "sunrise": "7:11 AM", + "dhuhr": "1:15 PM", + "asr": "4:21 PM", + "maghrib": "7:18 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-03-14", + "fajr": "5:54 AM", + "sunrise": "7:11 AM", + "dhuhr": "1:15 PM", + "asr": "4:20 PM", + "maghrib": "7:17 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-03-15", + "fajr": "5:54 AM", + "sunrise": "7:11 AM", + "dhuhr": "1:15 PM", + "asr": "4:19 PM", + "maghrib": "7:17 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-03-16", + "fajr": "5:54 AM", + "sunrise": "7:10 AM", + "dhuhr": "1:15 PM", + "asr": "4:18 PM", + "maghrib": "7:17 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-03-17", + "fajr": "5:53 AM", + "sunrise": "7:10 AM", + "dhuhr": "1:14 PM", + "asr": "4:17 PM", + "maghrib": "7:17 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-03-18", + "fajr": "5:53 AM", + "sunrise": "7:10 AM", + "dhuhr": "1:14 PM", + "asr": "4:16 PM", + "maghrib": "7:16 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-03-19", + "fajr": "5:53 AM", + "sunrise": "7:09 AM", + "dhuhr": "1:14 PM", + "asr": "4:15 PM", + "maghrib": "7:16 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-03-20", + "fajr": "5:52 AM", + "sunrise": "7:09 AM", + "dhuhr": "1:13 PM", + "asr": "4:14 PM", + "maghrib": "7:16 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-03-21", + "fajr": "5:52 AM", + "sunrise": "7:09 AM", + "dhuhr": "1:13 PM", + "asr": "4:13 PM", + "maghrib": "7:15 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-03-22", + "fajr": "5:52 AM", + "sunrise": "7:08 AM", + "dhuhr": "1:13 PM", + "asr": "4:12 PM", + "maghrib": "7:15 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-03-23", + "fajr": "5:51 AM", + "sunrise": "7:08 AM", + "dhuhr": "1:13 PM", + "asr": "4:12 PM", + "maghrib": "7:15 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-03-24", + "fajr": "5:51 AM", + "sunrise": "7:08 AM", + "dhuhr": "1:12 PM", + "asr": "4:13 PM", + "maghrib": "7:15 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-03-25", + "fajr": "5:51 AM", + "sunrise": "7:07 AM", + "dhuhr": "1:12 PM", + "asr": "4:13 PM", + "maghrib": "7:14 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-03-26", + "fajr": "5:50 AM", + "sunrise": "7:07 AM", + "dhuhr": "1:12 PM", + "asr": "4:14 PM", + "maghrib": "7:14 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-03-27", + "fajr": "5:50 AM", + "sunrise": "7:07 AM", + "dhuhr": "1:11 PM", + "asr": "4:14 PM", + "maghrib": "7:14 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-03-28", + "fajr": "5:49 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:11 PM", + "asr": "4:14 PM", + "maghrib": "7:14 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-03-29", + "fajr": "5:49 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:11 PM", + "asr": "4:15 PM", + "maghrib": "7:13 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-03-30", + "fajr": "5:49 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:10 PM", + "asr": "4:15 PM", + "maghrib": "7:13 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-03-31", "fajr": "5:48 AM", "sunrise": "7:05 AM", + "dhuhr": "1:10 PM", + "asr": "4:16 PM", + "maghrib": "7:13 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-04-01", + "fajr": "5:48 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:10 PM", + "asr": "4:16 PM", + "maghrib": "7:13 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-04-02", + "fajr": "5:48 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:10 PM", + "asr": "4:16 PM", + "maghrib": "7:12 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-04-03", + "fajr": "5:47 AM", + "sunrise": "7:04 AM", "dhuhr": "1:09 PM", - "asr": "4:15 PM", + "asr": "4:17 PM", + "maghrib": "7:12 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-04-04", + "fajr": "5:47 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:09 PM", + "asr": "4:17 PM", "maghrib": "7:12 PM", "isha": "8:21 PM" - }, - { - "date": "2016-05-01", + }, + { + "date": "2020-04-05", + "fajr": "5:46 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:09 PM", + "asr": "4:17 PM", + "maghrib": "7:12 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-04-06", + "fajr": "5:46 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:08 PM", + "asr": "4:17 PM", + "maghrib": "7:11 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-04-07", + "fajr": "5:46 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:08 PM", + "asr": "4:18 PM", + "maghrib": "7:11 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-04-08", + "fajr": "5:45 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:08 PM", + "asr": "4:18 PM", + "maghrib": "7:11 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-04-09", + "fajr": "5:45 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:08 PM", + "asr": "4:18 PM", + "maghrib": "7:11 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-04-10", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:07 PM", + "asr": "4:19 PM", + "maghrib": "7:10 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-04-11", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:07 PM", + "asr": "4:19 PM", + "maghrib": "7:10 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-04-12", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:07 PM", + "asr": "4:19 PM", + "maghrib": "7:10 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-04-13", + "fajr": "5:43 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:07 PM", + "asr": "4:19 PM", + "maghrib": "7:10 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-14", + "fajr": "5:43 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:06 PM", + "asr": "4:20 PM", + "maghrib": "7:10 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-15", + "fajr": "5:43 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:06 PM", + "asr": "4:20 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-16", + "fajr": "5:42 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:06 PM", + "asr": "4:20 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-17", + "fajr": "5:42 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:06 PM", + "asr": "4:20 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-18", + "fajr": "5:42 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:05 PM", + "asr": "4:20 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-19", + "fajr": "5:41 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:05 PM", + "asr": "4:21 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-20", + "fajr": "5:41 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:05 PM", + "asr": "4:21 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-21", + "fajr": "5:41 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:05 PM", + "asr": "4:21 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-22", + "fajr": "5:40 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:05 PM", + "asr": "4:21 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-23", + "fajr": "5:40 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:04 PM", + "asr": "4:21 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-24", + "fajr": "5:40 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:04 PM", + "asr": "4:22 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-25", + "fajr": "5:39 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:04 PM", + "asr": "4:22 PM", + "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-04-26", + "fajr": "5:39 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:04 PM", + "asr": "4:22 PM", + "maghrib": "7:09 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-04-27", + "fajr": "5:39 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:04 PM", + "asr": "4:22 PM", + "maghrib": "7:08 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-04-28", + "fajr": "5:38 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:04 PM", + "asr": "4:22 PM", + "maghrib": "7:08 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-04-29", + "fajr": "5:38 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:04 PM", + "asr": "4:22 PM", + "maghrib": "7:08 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-04-30", + "fajr": "5:38 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:23 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-01", + "fajr": "5:38 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:23 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-02", "fajr": "5:37 AM", "sunrise": "6:57 AM", "dhuhr": "1:03 PM", - "asr": "4:22 PM", - "maghrib": "7:07 PM", - "isha": "8:18 PM" - }, - { - "date": "2016-06-01", + "asr": "4:23 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-03", + "fajr": "5:37 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:23 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-04", + "fajr": "5:37 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:23 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-05", + "fajr": "5:37 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:23 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-06", + "fajr": "5:36 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:24 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-07", + "fajr": "5:36 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:24 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-08", + "fajr": "5:36 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:24 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-09", + "fajr": "5:36 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:24 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-10", + "fajr": "5:36 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:24 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-11", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:24 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-12", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:25 PM", + "maghrib": "7:08 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-05-13", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:25 PM", + "maghrib": "7:08 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-05-14", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:25 PM", + "maghrib": "7:08 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-05-15", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:25 PM", + "maghrib": "7:08 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-05-16", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:25 PM", + "maghrib": "7:08 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-05-17", + "fajr": "5:35 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:26 PM", + "maghrib": "7:08 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-05-18", + "fajr": "5:34 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:26 PM", + "maghrib": "7:08 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-05-19", + "fajr": "5:34 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:26 PM", + "maghrib": "7:08 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-05-20", + "fajr": "5:34 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:26 PM", + "maghrib": "7:08 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-05-21", + "fajr": "5:34 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:03 PM", + "asr": "4:26 PM", + "maghrib": "7:08 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-05-22", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:08 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-05-23", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:09 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-05-24", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:08 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-05-25", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:08 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-05-26", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:08 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-05-27", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:04 PM", + "asr": "4:28 PM", + "maghrib": "7:08 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-05-28", "fajr": "5:34 AM", "sunrise": "6:57 AM", "dhuhr": "1:04 PM", "asr": "4:28 PM", "maghrib": "7:08 PM", "isha": "8:23 PM" - }, - { - "date": "2016-07-01", + }, + { + "date": "2020-05-29", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:04 PM", + "asr": "4:28 PM", + "maghrib": "7:08 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-05-30", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:04 PM", + "asr": "4:28 PM", + "maghrib": "7:09 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-05-31", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:04 PM", + "asr": "4:29 PM", + "maghrib": "7:09 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-06-01", + "fajr": "5:34 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:04 PM", + "asr": "4:29 PM", + "maghrib": "7:09 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-06-02", + "fajr": "5:34 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:05 PM", + "asr": "4:29 PM", + "maghrib": "7:09 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-06-03", + "fajr": "5:34 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:05 PM", + "asr": "4:29 PM", + "maghrib": "7:09 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-06-04", + "fajr": "5:35 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:05 PM", + "asr": "4:30 PM", + "maghrib": "7:10 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-06-05", + "fajr": "5:35 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:05 PM", + "asr": "4:30 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-06-06", + "fajr": "5:35 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:05 PM", + "asr": "4:30 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-06-07", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:05 PM", + "asr": "4:30 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-06-08", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:06 PM", + "asr": "4:30 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-06-09", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:06 PM", + "asr": "4:31 PM", + "maghrib": "7:11 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-06-10", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:06 PM", + "asr": "4:31 PM", + "maghrib": "7:11 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-06-11", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:06 PM", + "asr": "4:31 PM", + "maghrib": "7:11 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-06-12", + "fajr": "5:36 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:06 PM", + "asr": "4:31 PM", + "maghrib": "7:11 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-06-13", + "fajr": "5:36 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:07 PM", + "asr": "4:32 PM", + "maghrib": "7:11 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-06-14", + "fajr": "5:36 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:07 PM", + "asr": "4:32 PM", + "maghrib": "7:12 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-06-15", + "fajr": "5:36 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:07 PM", + "asr": "4:32 PM", + "maghrib": "7:12 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-06-16", + "fajr": "5:36 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:07 PM", + "asr": "4:32 PM", + "maghrib": "7:12 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-06-17", + "fajr": "5:37 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:07 PM", + "asr": "4:33 PM", + "maghrib": "7:12 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-06-18", + "fajr": "5:37 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:08 PM", + "asr": "4:33 PM", + "maghrib": "7:12 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-06-19", + "fajr": "5:37 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:08 PM", + "asr": "4:33 PM", + "maghrib": "7:13 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-06-20", + "fajr": "5:37 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:08 PM", + "asr": "4:33 PM", + "maghrib": "7:13 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-06-21", + "fajr": "5:37 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:08 PM", + "asr": "4:33 PM", + "maghrib": "7:13 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-06-22", + "fajr": "5:38 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:09 PM", + "asr": "4:34 PM", + "maghrib": "7:13 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-06-23", + "fajr": "5:38 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:09 PM", + "asr": "4:34 PM", + "maghrib": "7:14 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-06-24", + "fajr": "5:38 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:09 PM", + "asr": "4:34 PM", + "maghrib": "7:14 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-06-25", + "fajr": "5:38 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:09 PM", + "asr": "4:34 PM", + "maghrib": "7:14 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-06-26", + "fajr": "5:39 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:09 PM", + "asr": "4:34 PM", + "maghrib": "7:14 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-06-27", + "fajr": "5:39 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:10 PM", + "asr": "4:35 PM", + "maghrib": "7:14 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-06-28", "fajr": "5:39 AM", "sunrise": "7:03 AM", "dhuhr": "1:10 PM", "asr": "4:35 PM", - "maghrib": "7:14 PM", - "isha": "8:29 PM" - }, - { - "date": "2016-08-01", + "maghrib": "7:15 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-06-29", + "fajr": "5:39 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:10 PM", + "asr": "4:35 PM", + "maghrib": "7:15 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-06-30", + "fajr": "5:40 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:10 PM", + "asr": "4:35 PM", + "maghrib": "7:15 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-01", + "fajr": "5:40 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:10 PM", + "asr": "4:35 PM", + "maghrib": "7:15 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-02", + "fajr": "5:40 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:11 PM", + "asr": "4:35 PM", + "maghrib": "7:15 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-03", + "fajr": "5:40 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:11 PM", + "asr": "4:36 PM", + "maghrib": "7:15 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-04", + "fajr": "5:41 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:11 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-05", + "fajr": "5:41 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:11 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-06", + "fajr": "5:41 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-07", + "fajr": "5:41 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-08", + "fajr": "5:41 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-09", + "fajr": "5:42 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-10", + "fajr": "5:42 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:16 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-11", + "fajr": "5:42 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-12", + "fajr": "5:42 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-13", + "fajr": "5:43 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-14", + "fajr": "5:43 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-15", + "fajr": "5:43 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-16", + "fajr": "5:43 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-17", + "fajr": "5:43 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-18", + "fajr": "5:44 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-19", + "fajr": "5:44 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-20", + "fajr": "5:44 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-21", + "fajr": "5:44 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-22", + "fajr": "5:44 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:31 PM" + }, + { + "date": "2020-07-23", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-24", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:36 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-25", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:35 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-26", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:35 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-27", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:35 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-28", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:35 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-29", + "fajr": "5:45 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:35 PM", + "maghrib": "7:17 PM", + "isha": "8:30 PM" + }, + { + "date": "2020-07-30", "fajr": "5:45 AM", "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:34 PM", + "maghrib": "7:17 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-07-31", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:34 PM", + "maghrib": "7:17 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-08-01", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:13 PM", + "asr": "4:34 PM", + "maghrib": "7:17 PM", + "isha": "8:29 PM" + }, + { + "date": "2020-08-02", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", "dhuhr": "1:12 PM", "asr": "4:34 PM", "maghrib": "7:16 PM", "isha": "8:29 PM" - }, - { - "date": "2016-09-01", - "fajr": "5:43 AM", + }, + { + "date": "2020-08-03", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:33 PM", + "maghrib": "7:16 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-08-04", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:33 PM", + "maghrib": "7:16 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-08-05", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:33 PM", + "maghrib": "7:16 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-08-06", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:32 PM", + "maghrib": "7:16 PM", + "isha": "8:28 PM" + }, + { + "date": "2020-08-07", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:32 PM", + "maghrib": "7:16 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-08-08", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:31 PM", + "maghrib": "7:16 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-08-09", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:12 PM", + "asr": "4:31 PM", + "maghrib": "7:15 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-08-10", + "fajr": "5:46 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:11 PM", + "asr": "4:31 PM", + "maghrib": "7:15 PM", + "isha": "8:27 PM" + }, + { + "date": "2020-08-11", + "fajr": "5:46 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:30 PM", + "maghrib": "7:15 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-08-12", + "fajr": "5:46 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:30 PM", + "maghrib": "7:15 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-08-13", + "fajr": "5:46 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:29 PM", + "maghrib": "7:15 PM", + "isha": "8:26 PM" + }, + { + "date": "2020-08-14", + "fajr": "5:46 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:29 PM", + "maghrib": "7:14 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-08-15", + "fajr": "5:46 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:11 PM", + "asr": "4:28 PM", + "maghrib": "7:14 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-08-16", + "fajr": "5:46 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:10 PM", + "asr": "4:28 PM", + "maghrib": "7:14 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-08-17", + "fajr": "5:46 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:10 PM", + "asr": "4:27 PM", + "maghrib": "7:14 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-08-18", + "fajr": "5:46 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:10 PM", + "asr": "4:26 PM", + "maghrib": "7:13 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-08-19", + "fajr": "5:45 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:10 PM", + "asr": "4:26 PM", + "maghrib": "7:13 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-08-20", + "fajr": "5:45 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:09 PM", + "asr": "4:25 PM", + "maghrib": "7:13 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-08-21", + "fajr": "5:45 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:09 PM", + "asr": "4:24 PM", + "maghrib": "7:13 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-08-22", + "fajr": "5:45 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:09 PM", + "asr": "4:24 PM", + "maghrib": "7:12 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-08-23", + "fajr": "5:45 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:09 PM", + "asr": "4:23 PM", + "maghrib": "7:12 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-08-24", + "fajr": "5:45 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:08 PM", + "asr": "4:22 PM", + "maghrib": "7:12 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-08-25", + "fajr": "5:45 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:08 PM", + "asr": "4:22 PM", + "maghrib": "7:11 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-08-26", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:08 PM", + "asr": "4:21 PM", + "maghrib": "7:11 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-08-27", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:07 PM", + "asr": "4:20 PM", + "maghrib": "7:11 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-08-28", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:07 PM", + "asr": "4:19 PM", + "maghrib": "7:10 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-08-29", + "fajr": "5:44 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:07 PM", + "asr": "4:19 PM", + "maghrib": "7:10 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-08-30", + "fajr": "5:44 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:07 PM", + "asr": "4:18 PM", + "maghrib": "7:10 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-08-31", + "fajr": "5:44 AM", "sunrise": "7:01 AM", "dhuhr": "1:06 PM", "asr": "4:17 PM", "maghrib": "7:09 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-09-01", + "fajr": "5:43 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:06 PM", + "asr": "4:16 PM", + "maghrib": "7:09 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-09-02", + "fajr": "5:43 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:06 PM", + "asr": "4:15 PM", + "maghrib": "7:09 PM", "isha": "8:18 PM" - }, - { - "date": "2016-10-01", + }, + { + "date": "2020-09-03", + "fajr": "5:43 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:05 PM", + "asr": "4:14 PM", + "maghrib": "7:08 PM", + "isha": "8:17 PM" + }, + { + "date": "2020-09-04", + "fajr": "5:43 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:05 PM", + "asr": "4:13 PM", + "maghrib": "7:08 PM", + "isha": "8:17 PM" + }, + { + "date": "2020-09-05", + "fajr": "5:42 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:05 PM", + "asr": "4:13 PM", + "maghrib": "7:07 PM", + "isha": "8:17 PM" + }, + { + "date": "2020-09-06", + "fajr": "5:42 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:04 PM", + "asr": "4:12 PM", + "maghrib": "7:07 PM", + "isha": "8:16 PM" + }, + { + "date": "2020-09-07", + "fajr": "5:42 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:04 PM", + "asr": "4:11 PM", + "maghrib": "7:07 PM", + "isha": "8:16 PM" + }, + { + "date": "2020-09-08", + "fajr": "5:42 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:04 PM", + "asr": "4:10 PM", + "maghrib": "7:06 PM", + "isha": "8:15 PM" + }, + { + "date": "2020-09-09", + "fajr": "5:41 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:03 PM", + "asr": "4:09 PM", + "maghrib": "7:06 PM", + "isha": "8:15 PM" + }, + { + "date": "2020-09-10", + "fajr": "5:41 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:03 PM", + "asr": "4:08 PM", + "maghrib": "7:06 PM", + "isha": "8:14 PM" + }, + { + "date": "2020-09-11", + "fajr": "5:41 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:02 PM", + "asr": "4:07 PM", + "maghrib": "7:05 PM", + "isha": "8:14 PM" + }, + { + "date": "2020-09-12", + "fajr": "5:41 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:02 PM", + "asr": "4:06 PM", + "maghrib": "7:05 PM", + "isha": "8:14 PM" + }, + { + "date": "2020-09-13", + "fajr": "5:40 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:02 PM", + "asr": "4:05 PM", + "maghrib": "7:04 PM", + "isha": "8:13 PM" + }, + { + "date": "2020-09-14", + "fajr": "5:40 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:01 PM", + "asr": "4:04 PM", + "maghrib": "7:04 PM", + "isha": "8:13 PM" + }, + { + "date": "2020-09-15", + "fajr": "5:40 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:01 PM", + "asr": "4:02 PM", + "maghrib": "7:04 PM", + "isha": "8:12 PM" + }, + { + "date": "2020-09-16", + "fajr": "5:39 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:01 PM", + "asr": "4:01 PM", + "maghrib": "7:03 PM", + "isha": "8:12 PM" + }, + { + "date": "2020-09-17", + "fajr": "5:39 AM", + "sunrise": "6:56 AM", + "dhuhr": "1:00 PM", + "asr": "4:00 PM", + "maghrib": "7:03 PM", + "isha": "8:12 PM" + }, + { + "date": "2020-09-18", + "fajr": "5:39 AM", + "sunrise": "6:55 AM", + "dhuhr": "1:00 PM", + "asr": "3:59 PM", + "maghrib": "7:02 PM", + "isha": "8:11 PM" + }, + { + "date": "2020-09-19", + "fajr": "5:38 AM", + "sunrise": "6:55 AM", + "dhuhr": "1:00 PM", + "asr": "3:59 PM", + "maghrib": "7:02 PM", + "isha": "8:11 PM" + }, + { + "date": "2020-09-20", + "fajr": "5:38 AM", + "sunrise": "6:55 AM", + "dhuhr": "12:59 PM", + "asr": "4:00 PM", + "maghrib": "7:02 PM", + "isha": "8:10 PM" + }, + { + "date": "2020-09-21", + "fajr": "5:38 AM", + "sunrise": "6:55 AM", + "dhuhr": "12:59 PM", + "asr": "4:00 PM", + "maghrib": "7:01 PM", + "isha": "8:10 PM" + }, + { + "date": "2020-09-22", + "fajr": "5:38 AM", + "sunrise": "6:54 AM", + "dhuhr": "12:59 PM", + "asr": "4:00 PM", + "maghrib": "7:01 PM", + "isha": "8:10 PM" + }, + { + "date": "2020-09-23", + "fajr": "5:37 AM", + "sunrise": "6:54 AM", + "dhuhr": "12:58 PM", + "asr": "4:01 PM", + "maghrib": "7:00 PM", + "isha": "8:09 PM" + }, + { + "date": "2020-09-24", + "fajr": "5:37 AM", + "sunrise": "6:54 AM", + "dhuhr": "12:58 PM", + "asr": "4:01 PM", + "maghrib": "7:00 PM", + "isha": "8:09 PM" + }, + { + "date": "2020-09-25", + "fajr": "5:37 AM", + "sunrise": "6:53 AM", + "dhuhr": "12:58 PM", + "asr": "4:01 PM", + "maghrib": "7:00 PM", + "isha": "8:08 PM" + }, + { + "date": "2020-09-26", + "fajr": "5:36 AM", + "sunrise": "6:53 AM", + "dhuhr": "12:57 PM", + "asr": "4:02 PM", + "maghrib": "6:59 PM", + "isha": "8:08 PM" + }, + { + "date": "2020-09-27", + "fajr": "5:36 AM", + "sunrise": "6:53 AM", + "dhuhr": "12:57 PM", + "asr": "4:02 PM", + "maghrib": "6:59 PM", + "isha": "8:08 PM" + }, + { + "date": "2020-09-28", + "fajr": "5:36 AM", + "sunrise": "6:52 AM", + "dhuhr": "12:57 PM", + "asr": "4:02 PM", + "maghrib": "6:59 PM", + "isha": "8:07 PM" + }, + { + "date": "2020-09-29", + "fajr": "5:35 AM", + "sunrise": "6:52 AM", + "dhuhr": "12:56 PM", + "asr": "4:03 PM", + "maghrib": "6:58 PM", + "isha": "8:07 PM" + }, + { + "date": "2020-09-30", + "fajr": "5:35 AM", + "sunrise": "6:52 AM", + "dhuhr": "12:56 PM", + "asr": "4:03 PM", + "maghrib": "6:58 PM", + "isha": "8:07 PM" + }, + { + "date": "2020-10-01", "fajr": "5:35 AM", "sunrise": "6:51 AM", + "dhuhr": "12:56 PM", + "asr": "4:03 PM", + "maghrib": "6:58 PM", + "isha": "8:06 PM" + }, + { + "date": "2020-10-02", + "fajr": "5:34 AM", + "sunrise": "6:51 AM", "dhuhr": "12:55 PM", - "asr": "4:02 PM", + "asr": "4:03 PM", + "maghrib": "6:57 PM", + "isha": "8:06 PM" + }, + { + "date": "2020-10-03", + "fajr": "5:34 AM", + "sunrise": "6:51 AM", + "dhuhr": "12:55 PM", + "asr": "4:04 PM", "maghrib": "6:57 PM", "isha": "8:06 PM" - }, - { - "date": "2016-11-01", + }, + { + "date": "2020-10-04", + "fajr": "5:34 AM", + "sunrise": "6:51 AM", + "dhuhr": "12:55 PM", + "asr": "4:04 PM", + "maghrib": "6:56 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-10-05", + "fajr": "5:33 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:54 PM", + "asr": "4:04 PM", + "maghrib": "6:56 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-10-06", + "fajr": "5:33 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:54 PM", + "asr": "4:04 PM", + "maghrib": "6:56 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-10-07", + "fajr": "5:33 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:54 PM", + "asr": "4:05 PM", + "maghrib": "6:56 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-10-08", + "fajr": "5:32 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:54 PM", + "asr": "4:05 PM", + "maghrib": "6:55 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-10-09", + "fajr": "5:32 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:53 PM", + "asr": "4:05 PM", + "maghrib": "6:55 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-10-10", + "fajr": "5:32 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:53 PM", + "asr": "4:05 PM", + "maghrib": "6:55 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-10-11", + "fajr": "5:32 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:53 PM", + "asr": "4:05 PM", + "maghrib": "6:54 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-10-12", + "fajr": "5:31 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:52 PM", + "asr": "4:06 PM", + "maghrib": "6:54 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-10-13", + "fajr": "5:31 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:52 PM", + "asr": "4:06 PM", + "maghrib": "6:54 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-10-14", + "fajr": "5:31 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:52 PM", + "asr": "4:06 PM", + "maghrib": "6:54 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-10-15", + "fajr": "5:31 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:52 PM", + "asr": "4:06 PM", + "maghrib": "6:53 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-10-16", + "fajr": "5:30 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:52 PM", + "asr": "4:06 PM", + "maghrib": "6:53 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-10-17", + "fajr": "5:30 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:07 PM", + "maghrib": "6:53 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-10-18", + "fajr": "5:30 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:07 PM", + "maghrib": "6:53 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-19", + "fajr": "5:30 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:07 PM", + "maghrib": "6:52 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-20", + "fajr": "5:29 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:51 PM", + "asr": "4:07 PM", + "maghrib": "6:52 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-21", + "fajr": "5:29 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:51 PM", + "asr": "4:07 PM", + "maghrib": "6:52 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-22", + "fajr": "5:29 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:51 PM", + "asr": "4:08 PM", + "maghrib": "6:52 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-23", + "fajr": "5:29 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:08 PM", + "maghrib": "6:52 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-24", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:08 PM", + "maghrib": "6:52 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-25", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:08 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-26", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:08 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-27", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:09 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-28", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:09 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-29", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:09 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-30", + "fajr": "5:28 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:09 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-10-31", "fajr": "5:27 AM", - "sunrise": "6:46 AM", - "dhuhr": "12:49 PM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", "asr": "4:09 PM", - "maghrib": "6:50 PM", - "isha": "8:01 PM" - }, - { - "date": "2016-12-01", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-11-01", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:10 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-11-02", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:10 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-11-03", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:10 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-11-04", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:10 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-11-05", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:11 PM", + "maghrib": "6:51 PM", + "isha": "8:02 PM" + }, + { + "date": "2020-11-06", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:11 PM", + "maghrib": "6:51 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-11-07", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:11 PM", + "maghrib": "6:51 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-11-08", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:11 PM", + "maghrib": "6:51 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-11-09", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:12 PM", + "maghrib": "6:51 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-11-10", + "fajr": "5:27 AM", + "sunrise": "6:47 AM", + "dhuhr": "12:50 PM", + "asr": "4:12 PM", + "maghrib": "6:51 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-11-11", + "fajr": "5:27 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:50 PM", + "asr": "4:12 PM", + "maghrib": "6:51 PM", + "isha": "8:03 PM" + }, + { + "date": "2020-11-12", + "fajr": "5:27 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:12 PM", + "maghrib": "6:51 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-11-13", + "fajr": "5:27 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:13 PM", + "maghrib": "6:52 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-11-14", + "fajr": "5:27 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:13 PM", + "maghrib": "6:52 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-11-15", + "fajr": "5:27 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:13 PM", + "maghrib": "6:52 PM", + "isha": "8:04 PM" + }, + { + "date": "2020-11-16", + "fajr": "5:27 AM", + "sunrise": "6:48 AM", + "dhuhr": "12:51 PM", + "asr": "4:14 PM", + "maghrib": "6:52 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-11-17", + "fajr": "5:27 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:51 PM", + "asr": "4:14 PM", + "maghrib": "6:52 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-11-18", + "fajr": "5:27 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:52 PM", + "asr": "4:14 PM", + "maghrib": "6:52 PM", + "isha": "8:05 PM" + }, + { + "date": "2020-11-19", + "fajr": "5:28 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:52 PM", + "asr": "4:15 PM", + "maghrib": "6:53 PM", + "isha": "8:06 PM" + }, + { + "date": "2020-11-20", + "fajr": "5:28 AM", + "sunrise": "6:49 AM", + "dhuhr": "12:52 PM", + "asr": "4:15 PM", + "maghrib": "6:53 PM", + "isha": "8:06 PM" + }, + { + "date": "2020-11-21", + "fajr": "5:28 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:52 PM", + "asr": "4:15 PM", + "maghrib": "6:53 PM", + "isha": "8:06 PM" + }, + { + "date": "2020-11-22", + "fajr": "5:28 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:53 PM", + "asr": "4:16 PM", + "maghrib": "6:53 PM", + "isha": "8:07 PM" + }, + { + "date": "2020-11-23", + "fajr": "5:28 AM", + "sunrise": "6:50 AM", + "dhuhr": "12:53 PM", + "asr": "4:16 PM", + "maghrib": "6:54 PM", + "isha": "8:07 PM" + }, + { + "date": "2020-11-24", + "fajr": "5:28 AM", + "sunrise": "6:51 AM", + "dhuhr": "12:53 PM", + "asr": "4:16 PM", + "maghrib": "6:54 PM", + "isha": "8:07 PM" + }, + { + "date": "2020-11-25", + "fajr": "5:29 AM", + "sunrise": "6:51 AM", + "dhuhr": "12:54 PM", + "asr": "4:17 PM", + "maghrib": "6:54 PM", + "isha": "8:08 PM" + }, + { + "date": "2020-11-26", + "fajr": "5:29 AM", + "sunrise": "6:51 AM", + "dhuhr": "12:54 PM", + "asr": "4:17 PM", + "maghrib": "6:55 PM", + "isha": "8:08 PM" + }, + { + "date": "2020-11-27", + "fajr": "5:29 AM", + "sunrise": "6:52 AM", + "dhuhr": "12:54 PM", + "asr": "4:18 PM", + "maghrib": "6:55 PM", + "isha": "8:09 PM" + }, + { + "date": "2020-11-28", "fajr": "5:29 AM", "sunrise": "6:52 AM", "dhuhr": "12:55 PM", "asr": "4:18 PM", "maghrib": "6:55 PM", + "isha": "8:09 PM" + }, + { + "date": "2020-11-29", + "fajr": "5:30 AM", + "sunrise": "6:52 AM", + "dhuhr": "12:55 PM", + "asr": "4:18 PM", + "maghrib": "6:56 PM", + "isha": "8:10 PM" + }, + { + "date": "2020-11-30", + "fajr": "5:30 AM", + "sunrise": "6:53 AM", + "dhuhr": "12:55 PM", + "asr": "4:19 PM", + "maghrib": "6:56 PM", + "isha": "8:10 PM" + }, + { + "date": "2020-12-01", + "fajr": "5:30 AM", + "sunrise": "6:53 AM", + "dhuhr": "12:56 PM", + "asr": "4:19 PM", + "maghrib": "6:56 PM", "isha": "8:10 PM" - } - ] + }, + { + "date": "2020-12-02", + "fajr": "5:31 AM", + "sunrise": "6:54 AM", + "dhuhr": "12:56 PM", + "asr": "4:20 PM", + "maghrib": "6:57 PM", + "isha": "8:11 PM" + }, + { + "date": "2020-12-03", + "fajr": "5:31 AM", + "sunrise": "6:54 AM", + "dhuhr": "12:57 PM", + "asr": "4:20 PM", + "maghrib": "6:57 PM", + "isha": "8:11 PM" + }, + { + "date": "2020-12-04", + "fajr": "5:31 AM", + "sunrise": "6:54 AM", + "dhuhr": "12:57 PM", + "asr": "4:21 PM", + "maghrib": "6:57 PM", + "isha": "8:12 PM" + }, + { + "date": "2020-12-05", + "fajr": "5:32 AM", + "sunrise": "6:55 AM", + "dhuhr": "12:57 PM", + "asr": "4:21 PM", + "maghrib": "6:58 PM", + "isha": "8:12 PM" + }, + { + "date": "2020-12-06", + "fajr": "5:32 AM", + "sunrise": "6:55 AM", + "dhuhr": "12:58 PM", + "asr": "4:22 PM", + "maghrib": "6:58 PM", + "isha": "8:13 PM" + }, + { + "date": "2020-12-07", + "fajr": "5:32 AM", + "sunrise": "6:56 AM", + "dhuhr": "12:58 PM", + "asr": "4:22 PM", + "maghrib": "6:59 PM", + "isha": "8:13 PM" + }, + { + "date": "2020-12-08", + "fajr": "5:33 AM", + "sunrise": "6:56 AM", + "dhuhr": "12:59 PM", + "asr": "4:23 PM", + "maghrib": "6:59 PM", + "isha": "8:14 PM" + }, + { + "date": "2020-12-09", + "fajr": "5:33 AM", + "sunrise": "6:57 AM", + "dhuhr": "12:59 PM", + "asr": "4:23 PM", + "maghrib": "7:00 PM", + "isha": "8:14 PM" + }, + { + "date": "2020-12-10", + "fajr": "5:34 AM", + "sunrise": "6:57 AM", + "dhuhr": "1:00 PM", + "asr": "4:24 PM", + "maghrib": "7:00 PM", + "isha": "8:15 PM" + }, + { + "date": "2020-12-11", + "fajr": "5:34 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:00 PM", + "asr": "4:24 PM", + "maghrib": "7:00 PM", + "isha": "8:15 PM" + }, + { + "date": "2020-12-12", + "fajr": "5:34 AM", + "sunrise": "6:58 AM", + "dhuhr": "1:01 PM", + "asr": "4:24 PM", + "maghrib": "7:01 PM", + "isha": "8:16 PM" + }, + { + "date": "2020-12-13", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:01 PM", + "asr": "4:25 PM", + "maghrib": "7:01 PM", + "isha": "8:16 PM" + }, + { + "date": "2020-12-14", + "fajr": "5:35 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:02 PM", + "asr": "4:25 PM", + "maghrib": "7:02 PM", + "isha": "8:17 PM" + }, + { + "date": "2020-12-15", + "fajr": "5:36 AM", + "sunrise": "6:59 AM", + "dhuhr": "1:02 PM", + "asr": "4:26 PM", + "maghrib": "7:02 PM", + "isha": "8:17 PM" + }, + { + "date": "2020-12-16", + "fajr": "5:36 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:02 PM", + "asr": "4:26 PM", + "maghrib": "7:03 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-12-17", + "fajr": "5:37 AM", + "sunrise": "7:00 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:03 PM", + "isha": "8:18 PM" + }, + { + "date": "2020-12-18", + "fajr": "5:37 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:03 PM", + "asr": "4:27 PM", + "maghrib": "7:04 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-12-19", + "fajr": "5:38 AM", + "sunrise": "7:01 AM", + "dhuhr": "1:04 PM", + "asr": "4:28 PM", + "maghrib": "7:04 PM", + "isha": "8:19 PM" + }, + { + "date": "2020-12-20", + "fajr": "5:38 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:04 PM", + "asr": "4:28 PM", + "maghrib": "7:05 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-12-21", + "fajr": "5:39 AM", + "sunrise": "7:02 AM", + "dhuhr": "1:05 PM", + "asr": "4:29 PM", + "maghrib": "7:05 PM", + "isha": "8:20 PM" + }, + { + "date": "2020-12-22", + "fajr": "5:39 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:05 PM", + "asr": "4:29 PM", + "maghrib": "7:06 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-12-23", + "fajr": "5:40 AM", + "sunrise": "7:03 AM", + "dhuhr": "1:06 PM", + "asr": "4:30 PM", + "maghrib": "7:06 PM", + "isha": "8:21 PM" + }, + { + "date": "2020-12-24", + "fajr": "5:40 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:06 PM", + "asr": "4:30 PM", + "maghrib": "7:07 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-12-25", + "fajr": "5:41 AM", + "sunrise": "7:04 AM", + "dhuhr": "1:07 PM", + "asr": "4:31 PM", + "maghrib": "7:07 PM", + "isha": "8:22 PM" + }, + { + "date": "2020-12-26", + "fajr": "5:41 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:07 PM", + "asr": "4:31 PM", + "maghrib": "7:08 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-12-27", + "fajr": "5:42 AM", + "sunrise": "7:05 AM", + "dhuhr": "1:08 PM", + "asr": "4:32 PM", + "maghrib": "7:08 PM", + "isha": "8:23 PM" + }, + { + "date": "2020-12-28", + "fajr": "5:42 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:08 PM", + "asr": "4:32 PM", + "maghrib": "7:09 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-12-29", + "fajr": "5:43 AM", + "sunrise": "7:06 AM", + "dhuhr": "1:09 PM", + "asr": "4:33 PM", + "maghrib": "7:09 PM", + "isha": "8:24 PM" + }, + { + "date": "2020-12-30", + "fajr": "5:43 AM", + "sunrise": "7:07 AM", + "dhuhr": "1:09 PM", + "asr": "4:33 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + }, + { + "date": "2020-12-31", + "fajr": "5:44 AM", + "sunrise": "7:07 AM", + "dhuhr": "1:10 PM", + "asr": "4:34 PM", + "maghrib": "7:10 PM", + "isha": "8:25 PM" + } + ] } diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationMethod.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationMethod.kt index 769f4cd..5a5fbd0 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationMethod.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationMethod.kt @@ -1,5 +1,7 @@ package com.batoulapps.adhan2 +import com.batoulapps.adhan2.model.Rounding + /** * Standard calculation methods for calculating prayer times */ @@ -66,6 +68,12 @@ enum class CalculationMethod { */ SINGAPORE, + /** + * Diyanet İşleri Başkanlığı, Turkey + * Uses a Fajr angle of 18 and an Isha angle of 17 + */ + TURKEY, + /** * The default value for [CalculationParameters.method] when initializing a * [CalculationParameters] object. Sets a Fajr angle of 0 and an Isha angle of 0. @@ -80,17 +88,17 @@ enum class CalculationMethod { get() = when (this) { MUSLIM_WORLD_LEAGUE -> { CalculationParameters(fajrAngle = 18.0, ishaAngle = 17.0, method = this, - methodAdjustments = PrayerAdjustments(0, 0, 1, 0, 0, 0) + methodAdjustments = PrayerAdjustments(dhuhr = 1) ) } EGYPTIAN -> { CalculationParameters(fajrAngle = 19.5, ishaAngle = 17.5, method = this, - methodAdjustments = PrayerAdjustments(0, 0, 1, 0, 0, 0) + methodAdjustments = PrayerAdjustments(dhuhr = 1) ) } KARACHI -> { CalculationParameters(fajrAngle = 18.0, ishaAngle = 18.0, method = this, - methodAdjustments = PrayerAdjustments(0, 0, 1, 0, 0, 0) + methodAdjustments = PrayerAdjustments(dhuhr = 1) ) } UMM_AL_QURA -> { @@ -98,17 +106,17 @@ enum class CalculationMethod { } DUBAI -> { CalculationParameters(fajrAngle = 18.2, ishaAngle = 18.2, method = this, - methodAdjustments = PrayerAdjustments(0, -3, 3, 3, 3, 0) + methodAdjustments = PrayerAdjustments(sunrise = -3, dhuhr = 3, asr = 3, maghrib = 3) ) } MOON_SIGHTING_COMMITTEE -> { CalculationParameters(fajrAngle = 18.0, ishaAngle = 18.0, method = this, - methodAdjustments = PrayerAdjustments(0, 0, 5, 0, 3, 0) + methodAdjustments = PrayerAdjustments(dhuhr = 5, maghrib = 3) ) } NORTH_AMERICA -> { CalculationParameters(fajrAngle = 15.0, ishaAngle = 15.0, method = this, - methodAdjustments = PrayerAdjustments(0, 0, 1, 0, 0, 0) + methodAdjustments = PrayerAdjustments(dhuhr = 1) ) } KUWAIT -> { @@ -119,7 +127,13 @@ enum class CalculationMethod { } SINGAPORE -> { CalculationParameters(fajrAngle = 20.0, ishaAngle = 18.0, method = this, - methodAdjustments = PrayerAdjustments(0, 0, 1, 0, 0, 0) + methodAdjustments = PrayerAdjustments(dhuhr = 1), + rounding = Rounding.UP + ) + } + TURKEY -> { + CalculationParameters(fajrAngle = 18.0, ishaAngle = 17.0, method = this, + methodAdjustments = PrayerAdjustments(sunrise = -7, dhuhr = 5, asr = 4, maghrib = 7) ) } OTHER -> { diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationParameters.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationParameters.kt index 315f83c..e023c43 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationParameters.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/CalculationParameters.kt @@ -1,5 +1,8 @@ package com.batoulapps.adhan2 +import com.batoulapps.adhan2.model.Rounding +import com.batoulapps.adhan2.model.Shafaq + /** * Parameters used for PrayerTime calculation customization * @@ -24,19 +27,25 @@ data class CalculationParameters( val madhab: Madhab = Madhab.SHAFI, // Rules for placing bounds on Fajr and Isha for high latitude areas - val highLatitudeRule: HighLatitudeRule = HighLatitudeRule.MIDDLE_OF_THE_NIGHT, + val highLatitudeRule: HighLatitudeRule? = null, // Used to optionally add or subtract a set amount of time from each prayer time val prayerAdjustments: PrayerAdjustments = PrayerAdjustments(), // Used for method adjustments - val methodAdjustments: PrayerAdjustments = PrayerAdjustments() + val methodAdjustments: PrayerAdjustments = PrayerAdjustments(), + + // Rounding + val rounding: Rounding = Rounding.NEAREST, + + // Twilight in the sky + val shafaq: Shafaq = Shafaq.GENERAL ) { - data class NightPortions constructor(val fajr: Double, val isha: Double) + data class NightPortions(val fajr: Double, val isha: Double) - fun nightPortions(): NightPortions { - return when (this.highLatitudeRule) { + fun nightPortions(coordinates: Coordinates): NightPortions { + return when (highLatitudeRule ?: HighLatitudeRule.recommendedFor(coordinates)) { HighLatitudeRule.MIDDLE_OF_THE_NIGHT -> { NightPortions(1.0 / 2.0, 1.0 / 2.0) } diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/Coordinates.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/Coordinates.kt index 556b44b..66c9eac 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/Coordinates.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/Coordinates.kt @@ -6,4 +6,10 @@ package com.batoulapps.adhan2 class Coordinates( val latitude: Double, val longitude: Double -) +) { + + init { + require(latitude in -90.0..90.0) { "Latitude must be between -90 and 90 degrees" } + require(longitude in -180.0..180.0) { "Longitude must be between -180 and 180 degrees" } + } +} diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/HighLatitudeRule.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/HighLatitudeRule.kt index dd930bd..d91f4bc 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/HighLatitudeRule.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/HighLatitudeRule.kt @@ -20,5 +20,15 @@ enum class HighLatitudeRule { * Similar to [HighLatitudeRule.SEVENTH_OF_THE_NIGHT], but instead of 1/7th, the faction * of the night used is fajrAngle / 60 and ishaAngle/60. */ - TWILIGHT_ANGLE + TWILIGHT_ANGLE; + + companion object { + fun recommendedFor(coordinates: Coordinates): HighLatitudeRule { + return if (coordinates.latitude > 48.0) { + HighLatitudeRule.SEVENTH_OF_THE_NIGHT + } else { + HighLatitudeRule.MIDDLE_OF_THE_NIGHT + } + } + } } \ No newline at end of file diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/PrayerTimes.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/PrayerTimes.kt index 3e84796..243fd42 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/PrayerTimes.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/PrayerTimes.kt @@ -15,15 +15,21 @@ import com.batoulapps.adhan2.data.CalendarUtil.toUtcInstant import com.batoulapps.adhan2.data.DateComponents import com.batoulapps.adhan2.data.TimeComponents import com.batoulapps.adhan2.internal.SolarTime +import com.batoulapps.adhan2.model.Shafaq +import kotlin.math.abs +import kotlin.math.roundToInt import kotlinx.datetime.DateTimeUnit import kotlinx.datetime.Instant import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.toInstant -import kotlin.jvm.JvmOverloads -import kotlin.math.abs -import kotlin.math.roundToInt +/** + * Calculate PrayerTimes + * @param coordinates the coordinates of the location + * @param dateComponents the date components for that location + * @param calculationParameters the parameters for the calculation + */ data class PrayerTimes( val coordinates: Coordinates, val dateComponents: DateComponents, @@ -36,120 +42,6 @@ data class PrayerTimes( val maghrib: Instant val isha: Instant - @JvmOverloads - fun currentPrayer(instant: Instant): Prayer { - return when { - instant >= isha -> { ISHA } - instant >= maghrib -> { MAGHRIB } - instant >= asr -> { ASR } - instant >= dhuhr -> { DHUHR } - instant >= sunrise -> { SUNRISE } - instant >= fajr -> { FAJR } - else -> { NONE } - } - } - - @JvmOverloads - fun nextPrayer(instant: Instant): Prayer { - return when { - instant >= isha -> { NONE } - instant >= maghrib -> { ISHA } - instant >= asr -> { MAGHRIB } - instant >= dhuhr -> { ASR } - instant >= sunrise -> { DHUHR } - instant >= fajr -> { SUNRISE } - else -> { FAJR } - } - } - - fun timeForPrayer(prayer: Prayer): Instant? { - return when (prayer) { - FAJR -> fajr - SUNRISE -> sunrise - DHUHR -> dhuhr - ASR -> asr - MAGHRIB -> maghrib - ISHA -> isha - NONE -> null - } - } - - companion object { - private fun seasonAdjustedMorningTwilight( - latitude: Double, day: Int, year: Int, sunrise: LocalDateTime - ): LocalDateTime { - val a: Double = 75 + 28.65 / 55.0 * abs(latitude) - val b: Double = 75 + 19.44 / 55.0 * abs(latitude) - val c: Double = 75 + 32.74 / 55.0 * abs(latitude) - val d: Double = 75 + 48.10 / 55.0 * abs(latitude) - val dyy = daysSinceSolstice(day, year, latitude) - val adjustment = when { - dyy < 91 -> { a + (b - a) / 91.0 * dyy } - dyy < 137 -> { b + (c - b) / 46.0 * (dyy - 91) } - dyy < 183 -> { c + (d - c) / 46.0 * (dyy - 137) } - dyy < 229 -> { d + (c - d) / 46.0 * (dyy - 183) } - dyy < 275 -> { c + (b - c) / 46.0 * (dyy - 229) } - else -> { b + (a - b) / 91.0 * (dyy - 275) } - } - return add(sunrise, -(adjustment * 60.0).roundToInt(), DateTimeUnit.SECOND) - } - - private fun seasonAdjustedEveningTwilight( - latitude: Double, day: Int, year: Int, sunset: LocalDateTime - ): LocalDateTime { - val a: Double = 75 + 25.60 / 55.0 * abs(latitude) - val b: Double = 75 + 2.050 / 55.0 * abs(latitude) - val c: Double = 75 - 9.210 / 55.0 * abs(latitude) - val d: Double = 75 + 6.140 / 55.0 * abs(latitude) - val dyy = daysSinceSolstice(day, year, latitude) - val adjustment = when { - dyy < 91 -> { a + (b - a) / 91.0 * dyy } - dyy < 137 -> { b + (c - b) / 46.0 * (dyy - 91) } - dyy < 183 -> { c + (d - c) / 46.0 * (dyy - 137) } - dyy < 229 -> { d + (c - d) / 46.0 * (dyy - 183) } - dyy < 275 -> { c + (b - c) / 46.0 * (dyy - 229) } - else -> { b + (a - b) / 91.0 * (dyy - 275) } - } - return add(sunset, (adjustment * 60.0).roundToInt(), DateTimeUnit.SECOND) - } - - fun daysSinceSolstice(dayOfYear: Int, year: Int, latitude: Double): Int { - var daysSinceSolistice: Int - val northernOffset = 10 - val isLeapYear = isLeapYear(year) - val southernOffset = if (isLeapYear) 173 else 172 - val daysInYear = if (isLeapYear) 366 else 365 - if (latitude >= 0) { - daysSinceSolistice = dayOfYear + northernOffset - if (daysSinceSolistice >= daysInYear) { - daysSinceSolistice -= daysInYear - } - } else { - daysSinceSolistice = dayOfYear - southernOffset - if (daysSinceSolistice < 0) { - daysSinceSolistice += daysInYear - } - } - return daysSinceSolistice - } - } - - private fun LocalDateTime.before(other: LocalDateTime): Boolean { - return toInstant(TimeZone.UTC).toEpochMilliseconds() < - other.toInstant(TimeZone.UTC).toEpochMilliseconds() - } - - private fun LocalDateTime.after(other: LocalDateTime): Boolean { - return toInstant(TimeZone.UTC).toEpochMilliseconds() > - other.toInstant(TimeZone.UTC).toEpochMilliseconds() - } - - /** - * Calculate PrayerTimes - * @param coordinates the coordinates of the location - * @param date the date components for that location - * @param parameters the parameters for the calculation - */ init { var tempFajr: LocalDateTime? = null val tempSunrise: LocalDateTime? @@ -177,11 +69,15 @@ data class PrayerTimes( val tomorrowSolarTime = SolarTime(tomorrow, coordinates) val tomorrowSunriseComponents = TimeComponents.fromDouble(tomorrowSolarTime.sunrise) - val error = transit == null || sunriseComponents == null || sunsetComponents == null || tomorrowSunriseComponents == null - if (!error) { - tempDhuhr = transit!! - tempSunrise = sunriseComponents!! - tempMaghrib = sunsetComponents!! + if (transit == null || sunriseComponents == null || sunsetComponents == null || tomorrowSunriseComponents == null) { + tempSunrise = null + tempDhuhr = null + tempAsr = null + tempMaghrib = null + } else { + tempDhuhr = transit + tempSunrise = sunriseComponents + tempMaghrib = sunsetComponents timeComponents = TimeComponents.fromDouble( solarTime.afternoon(calculationParameters.madhab.shadowLength) ) @@ -191,16 +87,17 @@ data class PrayerTimes( } // get night length - val tomorrowSunrise = tomorrowSunriseComponents!!.dateComponents(tomorrow) + val tomorrowSunrise = tomorrowSunriseComponents.dateComponents(tomorrow) val night = tomorrowSunrise.toInstant(TimeZone.UTC).toEpochMilliseconds() - sunsetComponents.toInstant(TimeZone.UTC).toEpochMilliseconds() timeComponents = TimeComponents.fromDouble( - solarTime.hourAngle(-calculationParameters.fajrAngle, false)) + solarTime.timeForSolarAngle(-calculationParameters.fajrAngle, false)) if (timeComponents != null) { tempFajr = timeComponents.dateComponents(dateComponents) } + // special case for moonsighting committee above latitude 55 if (calculationParameters.method === CalculationMethod.MOON_SIGHTING_COMMITTEE && coordinates.latitude >= 55 ) { @@ -209,7 +106,7 @@ data class PrayerTimes( ) } - val nightPortions = calculationParameters.nightPortions() + val nightPortions = calculationParameters.nightPortions(coordinates) val safeFajr: LocalDateTime = if (calculationParameters.method === CalculationMethod.MOON_SIGHTING_COMMITTEE) { @@ -236,12 +133,13 @@ data class PrayerTimes( tempIsha = add(tempMaghrib, calculationParameters.ishaInterval * 60, DateTimeUnit.SECOND) } else { timeComponents = TimeComponents.fromDouble( - solarTime.hourAngle(-calculationParameters.ishaAngle, true) + solarTime.timeForSolarAngle(-calculationParameters.ishaAngle, true) ) if (timeComponents != null) { tempIsha = timeComponents.dateComponents(dateComponents) } + // special case for moonsighting committee above latitude 55 if (calculationParameters.method === CalculationMethod.MOON_SIGHTING_COMMITTEE && coordinates.latitude >= 55 ) { @@ -251,7 +149,7 @@ data class PrayerTimes( val safeIsha: LocalDateTime = if (calculationParameters.method === CalculationMethod.MOON_SIGHTING_COMMITTEE) { seasonAdjustedEveningTwilight( - coordinates.latitude, dayOfYear, dateComponents.year, sunsetComponents + coordinates.latitude, dayOfYear, dateComponents.year, sunsetComponents, calculationParameters.shafaq ) } else { val portion = nightPortions.isha @@ -263,60 +161,189 @@ data class PrayerTimes( tempIsha = safeIsha } } - } else { - tempSunrise = null - tempDhuhr = null - tempAsr = null - tempMaghrib = null } - if (error || tempAsr == null) { + if (tempFajr == null || tempSunrise == null || tempDhuhr == null || tempAsr == null || tempMaghrib == null || tempIsha == null) { // if we don't have all prayer times then initialization failed throw IllegalStateException() } else { // Assign final times to public struct members with all offsets fajr = roundedMinute( add( - add(tempFajr!!, calculationParameters.prayerAdjustments.fajr, DateTimeUnit.MINUTE), + add(tempFajr, calculationParameters.prayerAdjustments.fajr, DateTimeUnit.MINUTE), calculationParameters.methodAdjustments.fajr, DateTimeUnit.MINUTE - ) + ), + rounding = calculationParameters.rounding ).toUtcInstant() sunrise = roundedMinute( add( - add(tempSunrise!!, calculationParameters.prayerAdjustments.sunrise, DateTimeUnit.MINUTE), + add(tempSunrise, calculationParameters.prayerAdjustments.sunrise, DateTimeUnit.MINUTE), calculationParameters.methodAdjustments.sunrise, DateTimeUnit.MINUTE - ) + ), + rounding = calculationParameters.rounding ).toUtcInstant() dhuhr = roundedMinute( add( - add(tempDhuhr!!, calculationParameters.prayerAdjustments.dhuhr, DateTimeUnit.MINUTE), + add(tempDhuhr, calculationParameters.prayerAdjustments.dhuhr, DateTimeUnit.MINUTE), calculationParameters.methodAdjustments.dhuhr, DateTimeUnit.MINUTE - ) + ), + rounding = calculationParameters.rounding ).toUtcInstant() asr = roundedMinute( add( add(tempAsr, calculationParameters.prayerAdjustments.asr, DateTimeUnit.MINUTE), calculationParameters.methodAdjustments.asr, DateTimeUnit.MINUTE - ) + ), + rounding = calculationParameters.rounding ).toUtcInstant() maghrib = roundedMinute( add( - add(tempMaghrib!!, calculationParameters.prayerAdjustments.maghrib, DateTimeUnit.MINUTE), + add(tempMaghrib, calculationParameters.prayerAdjustments.maghrib, DateTimeUnit.MINUTE), calculationParameters.methodAdjustments.maghrib, DateTimeUnit.MINUTE - ) + ), + rounding = calculationParameters.rounding ).toUtcInstant() isha = roundedMinute( add( - add(tempIsha!!, calculationParameters.prayerAdjustments.isha, DateTimeUnit.MINUTE), + add(tempIsha, calculationParameters.prayerAdjustments.isha, DateTimeUnit.MINUTE), calculationParameters.methodAdjustments.isha, DateTimeUnit.MINUTE - ) + ), + rounding = calculationParameters.rounding ).toUtcInstant() } } + + fun currentPrayer(instant: Instant): Prayer { + return when { + instant >= isha -> { ISHA } + instant >= maghrib -> { MAGHRIB } + instant >= asr -> { ASR } + instant >= dhuhr -> { DHUHR } + instant >= sunrise -> { SUNRISE } + instant >= fajr -> { FAJR } + else -> { NONE } + } + } + + fun nextPrayer(instant: Instant): Prayer { + return when { + instant >= isha -> { NONE } + instant >= maghrib -> { ISHA } + instant >= asr -> { MAGHRIB } + instant >= dhuhr -> { ASR } + instant >= sunrise -> { DHUHR } + instant >= fajr -> { SUNRISE } + else -> { FAJR } + } + } + + fun timeForPrayer(prayer: Prayer): Instant? { + return when (prayer) { + FAJR -> fajr + SUNRISE -> sunrise + DHUHR -> dhuhr + ASR -> asr + MAGHRIB -> maghrib + ISHA -> isha + NONE -> null + } + } + + private fun LocalDateTime.before(other: LocalDateTime): Boolean { + return toInstant(TimeZone.UTC).toEpochMilliseconds() < + other.toInstant(TimeZone.UTC).toEpochMilliseconds() + } + + private fun LocalDateTime.after(other: LocalDateTime): Boolean { + return toInstant(TimeZone.UTC).toEpochMilliseconds() > + other.toInstant(TimeZone.UTC).toEpochMilliseconds() + } + + companion object { + private fun seasonAdjustedMorningTwilight( + latitude: Double, day: Int, year: Int, sunrise: LocalDateTime + ): LocalDateTime { + val a: Double = 75 + 28.65 / 55.0 * abs(latitude) + val b: Double = 75 + 19.44 / 55.0 * abs(latitude) + val c: Double = 75 + 32.74 / 55.0 * abs(latitude) + val d: Double = 75 + 48.10 / 55.0 * abs(latitude) + val dyy = daysSinceSolstice(day, year, latitude) + val adjustment = when { + dyy < 91 -> { a + (b - a) / 91.0 * dyy } + dyy < 137 -> { b + (c - b) / 46.0 * (dyy - 91) } + dyy < 183 -> { c + (d - c) / 46.0 * (dyy - 137) } + dyy < 229 -> { d + (c - d) / 46.0 * (dyy - 183) } + dyy < 275 -> { c + (b - c) / 46.0 * (dyy - 229) } + else -> { b + (a - b) / 91.0 * (dyy - 275) } + } + return add(sunrise, -(adjustment * 60.0).roundToInt(), DateTimeUnit.SECOND) + } + + private fun seasonAdjustedEveningTwilight( + latitude: Double, day: Int, year: Int, sunset: LocalDateTime, shafaq: Shafaq + ): LocalDateTime { + + val a: Double + val b: Double + val c: Double + val d: Double + when (shafaq) { + Shafaq.GENERAL -> { + a = 75 + 25.60 / 55.0 * abs(latitude) + b = 75 + 2.050 / 55.0 * abs(latitude) + c = 75 - 9.210 / 55.0 * abs(latitude) + d = 75 + 6.140 / 55.0 * abs(latitude) + } + Shafaq.AHMER -> { + a = 62 + ((17.40 / 55.0) * abs(latitude)) + b = 62 - ((7.160 / 55.0) * abs(latitude)) + c = 62 + ((5.120 / 55.0) * abs(latitude)) + d = 62 + ((19.44 / 55.0) * abs(latitude)) + } + Shafaq.ABYAD -> { + a = 75 + ((25.60 / 55.0) * abs(latitude)) + b = 75 + ((7.160 / 55.0) * abs(latitude)) + c = 75 + ((36.84 / 55.0) * abs(latitude)) + d = 75 + ((81.84 / 55.0) * abs(latitude)) + } + } + + val dyy = daysSinceSolstice(day, year, latitude) + val adjustment = when { + dyy < 91 -> { a + (b - a) / 91.0 * dyy } + dyy < 137 -> { b + (c - b) / 46.0 * (dyy - 91) } + dyy < 183 -> { c + (d - c) / 46.0 * (dyy - 137) } + dyy < 229 -> { d + (c - d) / 46.0 * (dyy - 183) } + dyy < 275 -> { c + (b - c) / 46.0 * (dyy - 229) } + else -> { b + (a - b) / 91.0 * (dyy - 275) } + } + return add(sunset, (adjustment * 60.0).roundToInt(), DateTimeUnit.SECOND) + } + + fun daysSinceSolstice(dayOfYear: Int, year: Int, latitude: Double): Int { + var daysSinceSolistice: Int + val northernOffset = 10 + val isLeapYear = isLeapYear(year) + val southernOffset = if (isLeapYear) 173 else 172 + val daysInYear = if (isLeapYear) 366 else 365 + if (latitude >= 0) { + daysSinceSolistice = dayOfYear + northernOffset + if (daysSinceSolistice >= daysInYear) { + daysSinceSolistice -= daysInYear + } + } else { + daysSinceSolistice = dayOfYear - southernOffset + if (daysSinceSolistice < 0) { + daysSinceSolistice += daysInYear + } + } + return daysSinceSolistice + } + } } \ No newline at end of file diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/data/CalendarUtil.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/data/CalendarUtil.kt index b18e8dc..14c7bbe 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/data/CalendarUtil.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/data/CalendarUtil.kt @@ -1,5 +1,8 @@ package com.batoulapps.adhan2.data +import com.batoulapps.adhan2.model.Rounding +import kotlin.math.ceil +import kotlin.math.roundToInt import kotlinx.datetime.DateTimeUnit import kotlinx.datetime.Instant import kotlinx.datetime.LocalDateTime @@ -7,7 +10,6 @@ import kotlinx.datetime.TimeZone import kotlinx.datetime.plus import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime -import kotlin.math.roundToInt object CalendarUtil { /** @@ -25,23 +27,28 @@ object CalendarUtil { * @param localDateTime the date and time * @return the date and time with 0 seconds and minutes including rounded seconds */ - fun roundedMinute(localDateTime: LocalDateTime): LocalDateTime { + fun roundedMinute(localDateTime: LocalDateTime, rounding: Rounding = Rounding.NEAREST): LocalDateTime { val originalMinute = localDateTime.minute - val updatedMinute = (originalMinute + (localDateTime.second / 60f).roundToInt()) - val localDateTimeWithoutSeconds = LocalDateTime( + val (minute, second) = when (rounding) { + Rounding.NEAREST -> originalMinute + (localDateTime.second / 60f).roundToInt() to 0 + Rounding.UP -> originalMinute + ceil(localDateTime.second / 60f).roundToInt() to 0 + Rounding.NONE -> originalMinute to localDateTime.second + } + + val localDateTimeWithOldMinutes = LocalDateTime( year = localDateTime.year, monthNumber = localDateTime.monthNumber, dayOfMonth = localDateTime.dayOfMonth, hour = localDateTime.hour, - minute = localDateTime.minute, - second = 0 + minute = originalMinute, + second = second ) - return if (originalMinute != updatedMinute) { - val delta = updatedMinute - originalMinute - add(localDateTimeWithoutSeconds, delta, DateTimeUnit.MINUTE) + return if (originalMinute != minute) { + val delta = minute - originalMinute + add(localDateTimeWithOldMinutes, delta, DateTimeUnit.MINUTE) } else { - localDateTimeWithoutSeconds + localDateTimeWithOldMinutes } } diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarCoordinates.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarCoordinates.kt index f6a3212..d2603f6 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarCoordinates.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarCoordinates.kt @@ -57,14 +57,17 @@ internal class SolarCoordinates(julianDay: Double) { T, /* meanObliquityOfTheEcliptic */ε0 ).toRadians() - /* Equation from Astronomical Algorithms page 165 */declination = + /* Equation from Astronomical Algorithms page 165 */ + declination = asin(sin(εapp) * sin(λ)).toDegrees() - /* Equation from Astronomical Algorithms page 165 */rightAscension = unwindAngle( + /* Equation from Astronomical Algorithms page 165 */ + rightAscension = unwindAngle( atan2(cos(εapp) * sin(λ), cos(λ)).toDegrees() ) - /* Equation from Astronomical Algorithms page 88 */apparentSiderealTime = + /* Equation from Astronomical Algorithms page 88 */ + apparentSiderealTime = θ0 + ΔΨ * 3600 * cos((ε0 + Δε).toRadians()) / 3600 } } \ No newline at end of file diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarTime.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarTime.kt index 943ef5f..ca24f23 100644 --- a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarTime.kt +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/internal/SolarTime.kt @@ -9,7 +9,7 @@ import kotlin.math.abs import kotlin.math.atan import kotlin.math.tan -class SolarTime(today: DateComponents, coordinates: Coordinates) { +class SolarTime(date: DateComponents, coordinates: Coordinates) { val transit: Double val sunrise: Double val sunset: Double @@ -20,27 +20,8 @@ class SolarTime(today: DateComponents, coordinates: Coordinates) { private val nextSolar: SolarCoordinates private val approximateTransit: Double - fun hourAngle(angle: Double, afterTransit: Boolean): Double { - return correctedHourAngle( - approximateTransit, angle, observer, - afterTransit, solar.apparentSiderealTime, solar.rightAscension, - prevSolar.rightAscension, nextSolar.rightAscension, solar.declination, - prevSolar.declination, nextSolar.declination - ) - } - - // hours from transit - fun afternoon(shadowLength: ShadowLength): Double { - // TODO (from Swift version) source shadow angle calculation - val tangent: Double = abs(observer.latitude - solar.declination) - val inverse: Double = - shadowLength.shadowLength + tan(tangent.toRadians()) - val angle: Double = atan(1.0 / inverse).toDegrees() - return hourAngle(angle, true) - } - init { - val julianDate = CalendricalHelper.julianDay(today.year, today.month, today.day) + val julianDate = CalendricalHelper.julianDay(date.year, date.month, date.day) prevSolar = SolarCoordinates(julianDate - 1) solar = SolarCoordinates(julianDate) nextSolar = SolarCoordinates(julianDate + 1) @@ -68,4 +49,23 @@ class SolarTime(today: DateComponents, coordinates: Coordinates) { prevSolar.declination, nextSolar.declination ) } + + fun timeForSolarAngle(angle: Double, afterTransit: Boolean): Double { + return correctedHourAngle( + approximateTransit, angle, coordinates = observer, + afterTransit, solar.apparentSiderealTime, solar.rightAscension, + prevSolar.rightAscension, nextSolar.rightAscension, solar.declination, + prevSolar.declination, nextSolar.declination + ) + } + + // hours from transit + fun afternoon(shadowLength: ShadowLength): Double { + // TODO (from Swift version) source shadow angle calculation + val tangent: Double = abs(observer.latitude - solar.declination) + val inverse: Double = + shadowLength.shadowLength + tan(tangent.toRadians()) + val angle: Double = atan(1.0 / inverse).toDegrees() + return timeForSolarAngle(angle, true) + } } \ No newline at end of file diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/model/Rounding.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/model/Rounding.kt new file mode 100644 index 0000000..ca7472d --- /dev/null +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/model/Rounding.kt @@ -0,0 +1,7 @@ +package com.batoulapps.adhan2.model + +enum class Rounding { + NEAREST, + UP, + NONE +} \ No newline at end of file diff --git a/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/model/Shafaq.kt b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/model/Shafaq.kt new file mode 100644 index 0000000..82155c5 --- /dev/null +++ b/adhan/src/commonMain/kotlin/com/batoulapps/adhan2/model/Shafaq.kt @@ -0,0 +1,17 @@ +package com.batoulapps.adhan2.model + +/** + * Shafaq is the twilight in the sky. Different madhabs define the appearance of + * twilight differently. These values are used by the MoonsightingComittee method + * for the different ways to calculate Isha. + */ +enum class Shafaq { + // General is a combination of Ahmer and Abyad. + GENERAL, + + // Ahmar means the twilight is the red glow in the sky. Used by the Shafi, Maliki, and Hanbali madhabs. + AHMER, + + // Abyad means the twilight is the white glow in the sky. Used by the Hanafi madhab. + ABYAD +} \ No newline at end of file diff --git a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/CalculationParametersTest.kt b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/CalculationParametersTest.kt index 2220a0e..374760a 100644 --- a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/CalculationParametersTest.kt +++ b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/CalculationParametersTest.kt @@ -12,15 +12,16 @@ class CalculationParametersTest { @Test fun testNightPortion() { var parameters = CalculationParameters(fajrAngle = 18.0, ishaAngle = 18.0, highLatitudeRule = MIDDLE_OF_THE_NIGHT) - assertTrue { abs(parameters.nightPortions().fajr - 0.5) <= 0.001 } - assertTrue { abs(parameters.nightPortions().isha - 0.5) <= 0.001 } + val coordinates = Coordinates(latitude = 0.0, longitude = 0.0) + assertTrue { abs(parameters.nightPortions(coordinates).fajr - 0.5) <= 0.001 } + assertTrue { abs(parameters.nightPortions(coordinates).isha - 0.5) <= 0.001 } parameters = CalculationParameters(fajrAngle = 18.0, ishaAngle = 18.0, highLatitudeRule = SEVENTH_OF_THE_NIGHT) - assertTrue { abs(parameters.nightPortions().fajr - (1.0 / 7.0)) <= 0.001 } - assertTrue { abs(parameters.nightPortions().isha - (1.0 / 7.0)) <= 0.001 } + assertTrue { abs(parameters.nightPortions(coordinates).fajr - (1.0 / 7.0)) <= 0.001 } + assertTrue { abs(parameters.nightPortions(coordinates).isha - (1.0 / 7.0)) <= 0.001 } parameters = CalculationParameters(fajrAngle = 10.0, ishaAngle = 15.0, highLatitudeRule = TWILIGHT_ANGLE) - assertTrue { abs(parameters.nightPortions().fajr - (10.0 / 60.0)) <= 0.001 } - assertTrue { abs(parameters.nightPortions().isha - (15.0 / 60.0)) <= 0.001 } + assertTrue { abs(parameters.nightPortions(coordinates).fajr - (10.0 / 60.0)) <= 0.001 } + assertTrue { abs(parameters.nightPortions(coordinates).isha - (15.0 / 60.0)) <= 0.001 } } } \ No newline at end of file diff --git a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/PrayerTimesTest.kt b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/PrayerTimesTest.kt index fde1443..c08465c 100644 --- a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/PrayerTimesTest.kt +++ b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/PrayerTimesTest.kt @@ -4,6 +4,8 @@ import com.batoulapps.adhan2.CalculationMethod.KARACHI import com.batoulapps.adhan2.CalculationMethod.MOON_SIGHTING_COMMITTEE import com.batoulapps.adhan2.CalculationMethod.MUSLIM_WORLD_LEAGUE import com.batoulapps.adhan2.CalculationMethod.NORTH_AMERICA +import com.batoulapps.adhan2.HighLatitudeRule.MIDDLE_OF_THE_NIGHT +import com.batoulapps.adhan2.HighLatitudeRule.SEVENTH_OF_THE_NIGHT import com.batoulapps.adhan2.HighLatitudeRule.TWILIGHT_ANGLE import com.batoulapps.adhan2.Madhab.HANAFI import com.batoulapps.adhan2.Prayer.ASR @@ -17,12 +19,15 @@ import com.batoulapps.adhan2.data.DateComponents import com.batoulapps.adhan2.internal.TestUtils.addSeconds import com.batoulapps.adhan2.internal.TestUtils.makeDate import com.batoulapps.adhan2.internal.TestUtils.pad -import kotlinx.datetime.Instant -import kotlinx.datetime.TimeZone -import kotlinx.datetime.toLocalDateTime +import com.batoulapps.adhan2.model.Shafaq import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertNotNull import kotlin.test.assertNull +import kotlinx.datetime.Instant +import kotlinx.datetime.TimeZone +import kotlinx.datetime.toLocalDateTime class PrayerTimesTest { @@ -165,6 +170,39 @@ class PrayerTimesTest { assertEquals("05:02 PM", stringifyAtTimezone(prayerTimes.isha, zoneId)) } + @Test + fun testDiyanet() { + // values from https://namazvakitleri.diyanet.gov.tr/en-US/9541/prayer-time-for-istanbul + val date = DateComponents(2020, 4, 16) + val parameters = CalculationMethod.TURKEY.parameters + val coordinates = Coordinates(41.005616, 28.976380) + + val zoneId = "Europe/Istanbul" + val prayerTimes = PrayerTimes(coordinates, date, parameters) + assertEquals("04:44 AM", stringifyAtTimezone(prayerTimes.fajr, zoneId)) + assertEquals("06:16 AM", stringifyAtTimezone(prayerTimes.sunrise, zoneId)) + assertEquals("01:09 PM", stringifyAtTimezone(prayerTimes.dhuhr, zoneId)) + assertEquals("04:53 PM", stringifyAtTimezone(prayerTimes.asr, zoneId)) // original time 4:52pm + assertEquals("07:52 PM", stringifyAtTimezone(prayerTimes.maghrib, zoneId)) + assertEquals("09:19 PM", stringifyAtTimezone(prayerTimes.isha, zoneId)) // original time 9:18pm + } + + @Test + fun testEgyptian() { + val date = DateComponents(2020, 1, 1) + val parameters = CalculationMethod.EGYPTIAN.parameters + val coordinates = Coordinates(latitude = 30.028703, longitude = 31.249528) + + val zoneId = "Africa/Cairo" + val prayerTimes = PrayerTimes(coordinates, date, parameters) + assertEquals("05:18 AM", stringifyAtTimezone(prayerTimes.fajr, zoneId)) + assertEquals("06:51 AM", stringifyAtTimezone(prayerTimes.sunrise, zoneId)) + assertEquals("11:59 AM", stringifyAtTimezone(prayerTimes.dhuhr, zoneId)) + assertEquals("02:47 PM", stringifyAtTimezone(prayerTimes.asr, zoneId)) + assertEquals("05:06 PM", stringifyAtTimezone(prayerTimes.maghrib, zoneId)) + assertEquals("06:29 PM", stringifyAtTimezone(prayerTimes.isha, zoneId)) + } + @Test fun testTimeForPrayer() { val components = DateComponents(2016, 7, 1) @@ -216,4 +254,221 @@ class PrayerTimesTest { assertEquals(ISHA, p.nextPrayer(addSeconds(p.maghrib, 1))) assertEquals(NONE, p.nextPrayer(addSeconds(p.isha, 1))) } + + @Test + fun testInvalidDate() { + assertFailsWith { + val date = DateComponents(0, 0, 0) + PrayerTimes(Coordinates(33.720817, 73.090032), date, MUSLIM_WORLD_LEAGUE.parameters) + } + + assertFailsWith { + val date = DateComponents(-1, 99, 99) + PrayerTimes(Coordinates(33.720817, 73.090032), date, MUSLIM_WORLD_LEAGUE.parameters) + } + } + + @Test + fun testInvalidLocation() { + assertFailsWith { + val date = DateComponents(2019, 1, 1) + PrayerTimes(Coordinates(999.0, 999.0), date, MUSLIM_WORLD_LEAGUE.parameters) + } + } + + @Test + fun testExtremeLocation() { + assertFailsWith { + val date = DateComponents(2018, 1, 1) + PrayerTimes(Coordinates(71.275009, -156.761368), date, MUSLIM_WORLD_LEAGUE.parameters) + } + + val date = DateComponents(2018, 3, 1) + val prayerTimes = PrayerTimes(Coordinates(71.275009, -156.761368), date, MUSLIM_WORLD_LEAGUE.parameters) + assertNotNull(prayerTimes.fajr) + } + + @Test + fun testHighLatitudeRule() { + val date = DateComponents(2020, 6, 15) + val parameters = MUSLIM_WORLD_LEAGUE.parameters.copy(highLatitudeRule = MIDDLE_OF_THE_NIGHT) + val coordinates = Coordinates(latitude = 55.983226, longitude = -3.216649) + + val zoneId = "Europe/London" + val prayerTimes = PrayerTimes(coordinates, date, parameters) + assertEquals("01:14 AM", stringifyAtTimezone(prayerTimes.fajr, zoneId)) + assertEquals("04:26 AM", stringifyAtTimezone(prayerTimes.sunrise, zoneId)) + assertEquals("01:14 PM", stringifyAtTimezone(prayerTimes.dhuhr, zoneId)) + assertEquals("05:46 PM", stringifyAtTimezone(prayerTimes.asr, zoneId)) + assertEquals("10:01 PM", stringifyAtTimezone(prayerTimes.maghrib, zoneId)) + assertEquals("01:14 AM", stringifyAtTimezone(prayerTimes.isha, zoneId)) + + val seventhParams = parameters.copy(highLatitudeRule = SEVENTH_OF_THE_NIGHT) + val seventhPrayerTimes = PrayerTimes(coordinates, date, seventhParams) + assertEquals("03:31 AM", stringifyAtTimezone(seventhPrayerTimes.fajr, zoneId)) + assertEquals("04:26 AM", stringifyAtTimezone(seventhPrayerTimes.sunrise, zoneId)) + assertEquals("01:14 PM", stringifyAtTimezone(seventhPrayerTimes.dhuhr, zoneId)) + assertEquals("05:46 PM", stringifyAtTimezone(seventhPrayerTimes.asr, zoneId)) + assertEquals("10:01 PM", stringifyAtTimezone(seventhPrayerTimes.maghrib, zoneId)) + assertEquals("10:56 PM", stringifyAtTimezone(seventhPrayerTimes.isha, zoneId)) + + val twilightParams = parameters.copy(highLatitudeRule = TWILIGHT_ANGLE) + val twilightPrayerTimes = PrayerTimes(coordinates, date, twilightParams) + assertEquals("02:31 AM", stringifyAtTimezone(twilightPrayerTimes.fajr, zoneId)) + assertEquals("04:26 AM", stringifyAtTimezone(twilightPrayerTimes.sunrise, zoneId)) + assertEquals("01:14 PM", stringifyAtTimezone(twilightPrayerTimes.dhuhr, zoneId)) + assertEquals("05:46 PM", stringifyAtTimezone(twilightPrayerTimes.asr, zoneId)) + assertEquals("10:01 PM", stringifyAtTimezone(twilightPrayerTimes.maghrib, zoneId)) + assertEquals("11:50 PM", stringifyAtTimezone(twilightPrayerTimes.isha, zoneId)) + + val autoHighLatitudeRule = parameters.copy(highLatitudeRule = null) + val autoPrayerTimes = PrayerTimes(coordinates, date, autoHighLatitudeRule) + assertEquals(seventhPrayerTimes.fajr, autoPrayerTimes.fajr) + assertEquals(seventhPrayerTimes.sunrise, autoPrayerTimes.sunrise) + assertEquals(seventhPrayerTimes.dhuhr, autoPrayerTimes.dhuhr) + assertEquals(seventhPrayerTimes.asr, autoPrayerTimes.asr) + assertEquals(seventhPrayerTimes.maghrib, autoPrayerTimes.maghrib) + assertEquals(seventhPrayerTimes.isha, autoPrayerTimes.isha) + } + + @Test + fun testRecommendedHighLatitudeRule() { + val coords1 = Coordinates(latitude = 45.983226, longitude = -3.216649) + assertEquals(MIDDLE_OF_THE_NIGHT, HighLatitudeRule.recommendedFor(coords1)) + + val coords2 = Coordinates(latitude = 48.983226, longitude = -3.216649) + assertEquals(SEVENTH_OF_THE_NIGHT, HighLatitudeRule.recommendedFor(coords2)) + } + + @Test + fun testShafaqGeneral() { + val parameters = MOON_SIGHTING_COMMITTEE.parameters.copy(shafaq = Shafaq.GENERAL, madhab = HANAFI) + val coordinates = Coordinates(latitude = 43.494, longitude = -79.844) + + val zoneId = "America/New_York" + + val date = DateComponents(2021, 1, 1) + val prayerTimes = PrayerTimes(coordinates, date, parameters) + assertEquals("06:16 AM", stringifyAtTimezone(prayerTimes.fajr, zoneId)) + assertEquals("07:52 AM", stringifyAtTimezone(prayerTimes.sunrise, zoneId)) + assertEquals("12:28 PM", stringifyAtTimezone(prayerTimes.dhuhr, zoneId)) + assertEquals("03:12 PM", stringifyAtTimezone(prayerTimes.asr, zoneId)) + assertEquals("04:57 PM", stringifyAtTimezone(prayerTimes.maghrib, zoneId)) + assertEquals("06:27 PM", stringifyAtTimezone(prayerTimes.isha, zoneId)) + + val secondDate = DateComponents(2021, 4, 1) + val secondPrayerTimes = PrayerTimes(coordinates, secondDate, parameters) + assertEquals("05:28 AM", stringifyAtTimezone(secondPrayerTimes.fajr, zoneId)) + assertEquals("07:01 AM", stringifyAtTimezone(secondPrayerTimes.sunrise, zoneId)) + assertEquals("01:28 PM", stringifyAtTimezone(secondPrayerTimes.dhuhr, zoneId)) + assertEquals("05:53 PM", stringifyAtTimezone(secondPrayerTimes.asr, zoneId)) + assertEquals("07:49 PM", stringifyAtTimezone(secondPrayerTimes.maghrib, zoneId)) + assertEquals("09:01 PM", stringifyAtTimezone(secondPrayerTimes.isha, zoneId)) + + val thirdDate = DateComponents(2021, 7, 1) + val thirdPrayerTimes = PrayerTimes(coordinates, thirdDate, parameters) + assertEquals("03:52 AM", stringifyAtTimezone(thirdPrayerTimes.fajr, zoneId)) + assertEquals("05:42 AM", stringifyAtTimezone(thirdPrayerTimes.sunrise, zoneId)) + assertEquals("01:28 PM", stringifyAtTimezone(thirdPrayerTimes.dhuhr, zoneId)) + assertEquals("06:42 PM", stringifyAtTimezone(thirdPrayerTimes.asr, zoneId)) + assertEquals("09:07 PM", stringifyAtTimezone(thirdPrayerTimes.maghrib, zoneId)) + assertEquals("10:22 PM", stringifyAtTimezone(thirdPrayerTimes.isha, zoneId)) + + val fourthDate = DateComponents(2021, 11, 1) + val fourthPrayerTimes = PrayerTimes(coordinates, fourthDate, parameters) + assertEquals("06:22 AM", stringifyAtTimezone(fourthPrayerTimes.fajr, zoneId)) + assertEquals("07:55 AM", stringifyAtTimezone(fourthPrayerTimes.sunrise, zoneId)) + assertEquals("01:08 PM", stringifyAtTimezone(fourthPrayerTimes.dhuhr, zoneId)) + assertEquals("04:26 PM", stringifyAtTimezone(fourthPrayerTimes.asr, zoneId)) + assertEquals("06:13 PM", stringifyAtTimezone(fourthPrayerTimes.maghrib, zoneId)) + assertEquals("07:35 PM", stringifyAtTimezone(fourthPrayerTimes.isha, zoneId)) + } + + @Test + fun testShafaqAhmer() { + val parameters = MOON_SIGHTING_COMMITTEE.parameters.copy(shafaq = Shafaq.AHMER) + val coordinates = Coordinates(latitude = 43.494, longitude = -79.844) + + val zoneId = "America/New_York" + + val date = DateComponents(2021, 1, 1) + val prayerTimes = PrayerTimes(coordinates, date, parameters) + assertEquals("06:16 AM", stringifyAtTimezone(prayerTimes.fajr, zoneId)) + assertEquals("07:52 AM", stringifyAtTimezone(prayerTimes.sunrise, zoneId)) + assertEquals("12:28 PM", stringifyAtTimezone(prayerTimes.dhuhr, zoneId)) + assertEquals("02:37 PM", stringifyAtTimezone(prayerTimes.asr, zoneId)) + assertEquals("04:57 PM", stringifyAtTimezone(prayerTimes.maghrib, zoneId)) + assertEquals("06:07 PM", stringifyAtTimezone(prayerTimes.isha, zoneId)) // value from source is 6:08 PM + + val secondDate = DateComponents(2021, 4, 1) + val secondPrayerTimes = PrayerTimes(coordinates, secondDate, parameters) + assertEquals("05:28 AM", stringifyAtTimezone(secondPrayerTimes.fajr, zoneId)) + assertEquals("07:01 AM", stringifyAtTimezone(secondPrayerTimes.sunrise, zoneId)) + assertEquals("01:28 PM", stringifyAtTimezone(secondPrayerTimes.dhuhr, zoneId)) + assertEquals("04:59 PM", stringifyAtTimezone(secondPrayerTimes.asr, zoneId)) + assertEquals("07:49 PM", stringifyAtTimezone(secondPrayerTimes.maghrib, zoneId)) + assertEquals("08:45 PM", stringifyAtTimezone(secondPrayerTimes.isha, zoneId)) + + val thirdDate = DateComponents(2021, 7, 1) + val thirdPrayerTimes = PrayerTimes(coordinates, thirdDate, parameters) + assertEquals("03:52 AM", stringifyAtTimezone(thirdPrayerTimes.fajr, zoneId)) + assertEquals("05:42 AM", stringifyAtTimezone(thirdPrayerTimes.sunrise, zoneId)) + assertEquals("01:28 PM", stringifyAtTimezone(thirdPrayerTimes.dhuhr, zoneId)) + assertEquals("05:29 PM", stringifyAtTimezone(thirdPrayerTimes.asr, zoneId)) + assertEquals("09:07 PM", stringifyAtTimezone(thirdPrayerTimes.maghrib, zoneId)) + assertEquals("10:19 PM", stringifyAtTimezone(thirdPrayerTimes.isha, zoneId)) + + val fourthDate = DateComponents(2021, 11, 1) + val fourthPrayerTimes = PrayerTimes(coordinates, fourthDate, parameters) + assertEquals("06:22 AM", stringifyAtTimezone(fourthPrayerTimes.fajr, zoneId)) + assertEquals("07:55 AM", stringifyAtTimezone(fourthPrayerTimes.sunrise, zoneId)) + assertEquals("01:08 PM", stringifyAtTimezone(fourthPrayerTimes.dhuhr, zoneId)) + assertEquals("03:45 PM", stringifyAtTimezone(fourthPrayerTimes.asr, zoneId)) + assertEquals("06:13 PM", stringifyAtTimezone(fourthPrayerTimes.maghrib, zoneId)) + assertEquals("07:15 PM", stringifyAtTimezone(fourthPrayerTimes.isha, zoneId)) + } + + @Test + fun testShafaqAbyad() { + val parameters = MOON_SIGHTING_COMMITTEE.parameters.copy(shafaq = Shafaq.ABYAD, madhab = HANAFI) + val coordinates = Coordinates(latitude = 43.494, longitude = -79.844) + + val zoneId = "America/New_York" + + val date = DateComponents(2021, 1, 1) + val prayerTimes = PrayerTimes(coordinates, date, parameters) + assertEquals("06:16 AM", stringifyAtTimezone(prayerTimes.fajr, zoneId)) + assertEquals("07:52 AM", stringifyAtTimezone(prayerTimes.sunrise, zoneId)) + assertEquals("12:28 PM", stringifyAtTimezone(prayerTimes.dhuhr, zoneId)) + assertEquals("03:12 PM", stringifyAtTimezone(prayerTimes.asr, zoneId)) + assertEquals("04:57 PM", stringifyAtTimezone(prayerTimes.maghrib, zoneId)) + assertEquals("06:28 PM", stringifyAtTimezone(prayerTimes.isha, zoneId)) + + val secondDate = DateComponents(2021, 4, 1) + val secondPrayerTimes = PrayerTimes(coordinates, secondDate, parameters) + assertEquals("05:28 AM", stringifyAtTimezone(secondPrayerTimes.fajr, zoneId)) + assertEquals("07:01 AM", stringifyAtTimezone(secondPrayerTimes.sunrise, zoneId)) + assertEquals("01:28 PM", stringifyAtTimezone(secondPrayerTimes.dhuhr, zoneId)) + assertEquals("05:53 PM", stringifyAtTimezone(secondPrayerTimes.asr, zoneId)) + assertEquals("07:49 PM", stringifyAtTimezone(secondPrayerTimes.maghrib, zoneId)) + assertEquals("09:12 PM", stringifyAtTimezone(secondPrayerTimes.isha, zoneId)) + + val thirdDate = DateComponents(2021, 7, 1) + val thirdPrayerTimes = PrayerTimes(coordinates, thirdDate, parameters) + assertEquals("03:52 AM", stringifyAtTimezone(thirdPrayerTimes.fajr, zoneId)) + assertEquals("05:42 AM", stringifyAtTimezone(thirdPrayerTimes.sunrise, zoneId)) + assertEquals("01:28 PM", stringifyAtTimezone(thirdPrayerTimes.dhuhr, zoneId)) + assertEquals("06:42 PM", stringifyAtTimezone(thirdPrayerTimes.asr, zoneId)) + assertEquals("09:07 PM", stringifyAtTimezone(thirdPrayerTimes.maghrib, zoneId)) + assertEquals("11:17 PM", stringifyAtTimezone(thirdPrayerTimes.isha, zoneId)) + + val fourthDate = DateComponents(2021, 11, 1) + val fourthPrayerTimes = PrayerTimes(coordinates, fourthDate, parameters) + assertEquals("06:22 AM", stringifyAtTimezone(fourthPrayerTimes.fajr, zoneId)) + assertEquals("07:55 AM", stringifyAtTimezone(fourthPrayerTimes.sunrise, zoneId)) + assertEquals("01:08 PM", stringifyAtTimezone(fourthPrayerTimes.dhuhr, zoneId)) + assertEquals("04:26 PM", stringifyAtTimezone(fourthPrayerTimes.asr, zoneId)) + assertEquals("06:13 PM", stringifyAtTimezone(fourthPrayerTimes.maghrib, zoneId)) + assertEquals("07:37 PM", stringifyAtTimezone(fourthPrayerTimes.isha, zoneId)) + } } \ No newline at end of file diff --git a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/TimingTest.kt b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/TimingTest.kt index 8ace0e8..93fbb8d 100644 --- a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/TimingTest.kt +++ b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/TimingTest.kt @@ -10,6 +10,7 @@ import com.batoulapps.adhan2.CalculationMethod.NORTH_AMERICA import com.batoulapps.adhan2.CalculationMethod.OTHER import com.batoulapps.adhan2.CalculationMethod.QATAR import com.batoulapps.adhan2.CalculationMethod.SINGAPORE +import com.batoulapps.adhan2.CalculationMethod.TURKEY import com.batoulapps.adhan2.CalculationMethod.UMM_AL_QURA import com.batoulapps.adhan2.HighLatitudeRule.MIDDLE_OF_THE_NIGHT import com.batoulapps.adhan2.HighLatitudeRule.SEVENTH_OF_THE_NIGHT @@ -128,6 +129,7 @@ class TimingTest { "Kuwait" -> KUWAIT "Qatar" -> QATAR "Singapore" -> SINGAPORE + "Turkey" -> TURKEY else -> OTHER } diff --git a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/internal/AstronomicalTest.kt b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/internal/AstronomicalTest.kt index e8165d9..c41a9a7 100644 --- a/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/internal/AstronomicalTest.kt +++ b/adhan/src/commonTest/kotlin/com/batoulapps/adhan2/internal/AstronomicalTest.kt @@ -174,9 +174,9 @@ class AstronomicalTest { val transit = solar.transit val sunrise = solar.sunrise val sunset = solar.sunset - val twilightStart = solar.hourAngle(-6.0, /* afterTransit */false) - val twilightEnd = solar.hourAngle(-6.0, /* afterTransit */true) - val invalid = solar.hourAngle(-36.0, /* afterTransit */true) + val twilightStart = solar.timeForSolarAngle(-6.0, /* afterTransit */false) + val twilightEnd = solar.timeForSolarAngle(-6.0, /* afterTransit */true) + val invalid = solar.timeForSolarAngle(-36.0, /* afterTransit */true) assertEquals("9:38", timeString(twilightStart)) assertEquals("10:08", timeString(sunrise))