<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>API Kalender MABIMS | Blog</title><description>API konversi tanggal Hijriah resmi MABIMS untuk Indonesia. Data Kemenag, bukan Umm al-Qura.</description><link>https://mabims.dev/</link><language>id</language><fh:complete/><atom:link rel="self" href="https://mabims.dev/blog/rss.xml"/><item><title>Kenapa Tanggal Hijriah Berganti Saat Maghrib (dan Cara Menanganinya)</title><link>https://mabims.dev/blog/kenapa-tanggal-hijriah-berganti-saat-magrib/</link><guid isPermaLink="true">https://mabims.dev/blog/kenapa-tanggal-hijriah-berganti-saat-magrib/</guid><description>Jam 18:30 tanggal Masehi masih hari yang sama, tapi tanggal Hijriah sudah lompat ke besok. Ini penjelasan kenapa hari Hijriah dimulai saat maghrib, dan cara memakai parameter next=true di GET /today supaya aplikasimu nggak salah tampil.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ini bagian yang sering luput dari developer yang bikin fitur tanggal Hijriah. Kita terbiasa dengan pola “ganti hari jam 00:00”, jadi refleks kita ya ambil tanggal hari ini, tampilkan, selesai. Padahal buat kalender Hijriah, itu setengah benar.&lt;/p&gt;
&lt;p&gt;Di tulisan ini kita bahas dua hal: kenapa hari Hijriah dimulai saat maghrib, dan bagaimana parameter &lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt; di &lt;a href=&quot;https://mabims.dev/endpoints/today&quot;&gt;GET /today&lt;/a&gt; bisa bantu kamu menanganinya tanpa ribet.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kenapa-hari-hijriah-dimulai-saat-maghrib&quot;&gt;Kenapa hari Hijriah dimulai saat maghrib?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalender Masehi itu harinya dihitung dari satu tengah malam ke tengah malam berikutnya, murni konvensi. Semacam kesepakatan bersama negara-negara dunia gitu.&lt;/p&gt;
&lt;p&gt;Kalender Hijriah beda. Dia kalender bulan, dan awal bulannya ditentukan lewat &lt;strong&gt;pengamatan hilal&lt;/strong&gt;, bulan sabit tipis pertama yang muncul setelah bulan baru. Hilal itu hanya bisa dilihat (atau dihitung kriterianya) &lt;strong&gt;saat matahari terbenam&lt;/strong&gt;, di ufuk barat, sebentar setelah maghrib.&lt;/p&gt;
&lt;p&gt;Jadi logikanya begini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;matahari terbenam (maghrib)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;hilal diamati / kriterianya diperiksa&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kalau memenuhi, bulan baru dimulai&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;hari pertama bulan baru dimulai SEKARANG, bukan nunggu tengah malam&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Karena penentuan bulan baru terjadi di maghrib, wajar kalau batas pergantian hari-nya juga ikut di maghrib. Hari Hijriah berjalan dari maghrib ke maghrib.&lt;/p&gt;
&lt;p&gt;Kalau kamu pernah baca &lt;a href=&quot;https://mabims.dev/blog/deep-dive-mabims-computed&quot;&gt;deep dive mabims-computed&lt;/a&gt;, ini nyambung. Kriteria Neo MABIMS (ketinggian hilal minimal 3° dan elongasi minimal 6,4°) diperiksa &lt;strong&gt;saat matahari terbenam&lt;/strong&gt;. Titik waktu yang sama itulah yang jadi patokan pergantian hari.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;contoh-yang-paling-gampang-malam-pertama-ramadan&quot;&gt;Contoh yang paling gampang: malam pertama Ramadan&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ini contoh yang semua orang Indonesia pernah alami.&lt;/p&gt;
&lt;p&gt;Misalnya 1 Ramadan jatuh pada hari Rabu menurut penanggalan Masehi. Kapan tarawih pertama? &lt;strong&gt;Selasa malam.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kok bisa? Karena Selasa sore setelah maghrib, tanggal Hijriah sudah masuk 1 Ramadan. Malamnya sudah malam Ramadan, jadi tarawih dan sahur-nya ikut. Baru besoknya, hari Rabu, kita puasa hari pertama (ini juga alasan kenapa Sabtu malam disebut malam Minggu).&lt;/p&gt;
&lt;p&gt;Jadi di Selasa jam 19:00, kalender Masehi bilang “Selasa”, tapi kalender Hijriah sudah bilang “1 Ramadan”. Dua-duanya benar, cuma batas harinya beda.&lt;/p&gt;
&lt;p&gt;Hal yang sama berlaku untuk malam Jumat, malam 1 Muharram, malam Idul Fitri (malam takbiran), dan seterusnya. Semua “malam” itu sebenarnya sudah bagian dari hari berikutnya.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;masalahnya-buat-developer&quot;&gt;Masalahnya buat developer&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Sekarang bayangkan kamu bikin widget tanggal Hijriah di website masjid. Kamu panggil &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; seperti biasa:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Responsnya:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-08-24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;tz&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1448-03-11&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rabiul Akhir&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1448&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Senin&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ini benar untuk siang hari. Tapi jam 18:30 WIB, jamaah yang buka website itu secara syar’i sudah masuk tanggal 12 Rabiul Akhir, sementara widget kamu masih nampilin 11. Baru jam 00:00 nanti widget-nya “menyusul”.&lt;/p&gt;
&lt;p&gt;Selisih ±5 sampai 6 jam itu kelihatannya kecil, tapi buat website masjid, pesantren, atau aplikasi pengingat puasa (puasa Ayyamul Bidh, Senin Kamis, Asyura, dan sebagainya), tanggalnya bisa bikin bingung. Apalagi kalau malam itu memang malam yang penting.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;solusinya-nexttrue&quot;&gt;Solusinya: &lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Makanya &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; punya parameter &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;. Cara pakainya:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&amp;#x26;next=true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Responsnya sekarang punya satu objek tambahan bernama &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-08-24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;tz&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1448-03-11&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rabiul Akhir&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1448&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Senin&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;next&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1448-03-12&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rabiul Akhir&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1448&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Artinya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; = tanggal Hijriah &lt;strong&gt;sekarang&lt;/strong&gt; (sebelum maghrib).&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; = tanggal Hijriah yang berlaku &lt;strong&gt;setelah maghrib malam ini&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi satu kali request, kamu dapat dua-duanya. Tinggal pilih mana yang ditampilkan tergantung sekarang sudah lewat maghrib atau belum.&lt;/p&gt;
&lt;p&gt;Tanpa &lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt;, field &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; nggak muncul sama sekali dan respons-nya sama persis seperti sebelumnya. Jadi kode lama kamu aman, nggak ada yang rusak.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;satu-hal-penting-api-nggak-menghitung-waktu-maghrib&quot;&gt;Satu hal penting: API nggak menghitung waktu maghrib&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ini bagian yang perlu kamu baca baik-baik.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API ini nggak tahu jam berapa maghrib di tempatmu.&lt;/strong&gt; Dia cuma ngasih dua kandidat tanggal, &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; dan &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;. Kapan harus pindah dari yang pertama ke yang kedua, itu urusan sisi klien.&lt;/p&gt;
&lt;p&gt;Ini masuk akal kalau dipikir-pikir: waktu maghrib bergantung pada lokasi yang spesifik (kota, bahkan koordinat), dan berubah tiap hari. maghrib di Jakarta, Malang, Makassar, dan Jayapura beda-beda. Jadi API tetap fokus di hal yang dia kuasai, yaitu tanggal Hijriah, dan waktu maghrib kamu ambil dari sumber jadwal sholat yang sesuai lokasi pengguna kamu.&lt;/p&gt;
&lt;p&gt;Sumbernya bebas: library jadwal sholat, API jadwal sholat, atau data jadwal yang sudah kamu punya di aplikasi (kalau aplikasimu memang sudah menampilkan waktu sholat, tinggal pakai waktu maghrib yang sama).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;contoh-implementasi-javascript&quot;&gt;Contoh implementasi JavaScript&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ambilTanggalHijriah&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;waktumaghrib&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&amp;#x26;next=true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// waktumaghrib adalah objek Date untuk maghrib hari ini di lokasi user&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;sudahmaghrib&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &gt;= &lt;/span&gt;&lt;span&gt;&lt;span&gt;waktumaghrib&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sudahmaghrib&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Lalu tinggal ditampilkan seperti biasa:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;waktumaghrib&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;ambilWaktumaghribHariIni&lt;/span&gt;&lt;span&gt;(); &lt;/span&gt;&lt;span&gt;// dari sumber jadwal sholat kamu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;tanggal&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;ambilTanggalHijriah&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;waktumaghrib&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const { &lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt; } = &lt;/span&gt;&lt;span&gt;&lt;span&gt;tanggal&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;#hijri-date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Sebelum maghrib tampil &lt;code dir=&quot;auto&quot;&gt;11 Rabiul Akhir 1448 H&lt;/code&gt;, setelah maghrib otomatis jadi &lt;code dir=&quot;auto&quot;&gt;12 Rabiul Akhir 1448 H&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sisi bagusnya, kamu nggak perlu request ulang saat maghrib tiba. Data &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; dan &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; sudah ada dari awal, jadi cukup satu kali fetch, lalu bandingkan dengan jam saat ini (misalnya pakai &lt;code dir=&quot;auto&quot;&gt;setInterval&lt;/code&gt; atau cek tiap kali komponen dirender).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bagaimana-kalau-lewat-tengah-malam&quot;&gt;Bagaimana kalau lewat tengah malam?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Setelah jam 00:00, kalender Masehi ganti hari, dan &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; otomatis mengembalikan &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; yang sudah berisi tanggal Hijriah baru. Nilainya sama dengan &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; yang kemarin kamu ambil malam sebelumnya.&lt;/p&gt;
&lt;p&gt;Jadi &lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt; itu relevan di jendela waktu &lt;strong&gt;maghrib sampai tengah malam&lt;/strong&gt;. Di luar jendela itu, &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; saja sudah cukup. Nggak masalah kalau kamu tetap selalu kirim &lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt;, hasilnya tetap konsisten.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;timezone-dan-maghrib-itu-satu-paket&quot;&gt;Timezone dan maghrib itu satu paket&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau kamu baca &lt;a href=&quot;https://mabims.dev/blog/cara-pakai-mabims-api&quot;&gt;tutorial integrasi&lt;/a&gt;, saya sudah bahas soal parameter &lt;code dir=&quot;auto&quot;&gt;tz&lt;/code&gt;. Di sini timezone jadi makin penting.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt; selalu dihitung relatif terhadap “hari ini” di timezone yang kamu kirim. Jadi kalau user kamu di Makassar, kirim &lt;code dir=&quot;auto&quot;&gt;tz=Asia/Makassar&lt;/code&gt;. Kalau di Jayapura, kirim &lt;code dir=&quot;auto&quot;&gt;tz=Asia/Jayapura&lt;/code&gt;. Kalau tidak diisi, bawaannya &lt;code dir=&quot;auto&quot;&gt;Asia/Jakarta&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kolom &lt;code dir=&quot;auto&quot;&gt;input.tz&lt;/code&gt; di respons akan menampilkan zona waktu yang dipakai, jadi kamu bisa memastikan API menghitung di zona yang benar.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;jangan-lupa-cek-nextsource&quot;&gt;Jangan lupa cek &lt;code dir=&quot;auto&quot;&gt;next.source&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Objek &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; punya field &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; sendiri, terpisah dari &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; utama. Kenapa?&lt;/p&gt;
&lt;p&gt;Karena tanggal besok bisa saja berada di luar tabel resmi Kemenag walaupun tanggal hari ini masih di dalam tabel. Misalnya hari ini adalah hari terakhir yang tercakup tabel. Maka &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; utama &lt;code dir=&quot;auto&quot;&gt;mabims&lt;/code&gt;, tapi &lt;code dir=&quot;auto&quot;&gt;next.source&lt;/code&gt; bisa jadi &lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims-computed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Tanggal setelah maghrib dihitung dengan kriteria Neo MABIMS, bukan tabel resmi.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ini sejalan dengan prinsip yang sama di API ini: saya nggak mau hasil perhitungan diam-diam tampil seolah-olah data resmi. Kalau kamu mau tahu lebih lanjut soal bedanya, ada di &lt;a href=&quot;https://mabims.dev/blog/deep-dive-mabims-computed&quot;&gt;deep dive mabims-computed&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;soal-cache&quot;&gt;Soal cache&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; di-cache di edge sampai tengah malam lokal. Ini aman untuk &lt;code dir=&quot;auto&quot;&gt;next=true&lt;/code&gt; karena &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; dan &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; sama-sama berlaku sepanjang hari itu. Pergantian dari &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; ke &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; terjadi di sisi klien, bukan di server, jadi cache nggak akan bikin tanggal “nyangkut”.&lt;/p&gt;
&lt;p&gt;Tapi ada satu jebakan kalau kamu bikin cache sendiri di sisi server (misalnya di WordPress atau PHP seperti di &lt;a href=&quot;https://mabims.dev/blog/cara-tampilkan-tanggal-hijriah&quot;&gt;tutorial sebelumnya&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Jangan simpan hasil akhir yang sudah dipilih.&lt;/strong&gt; Simpan respons mentahnya (&lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; dan &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;), lalu tentukan mana yang tampil setiap kali halaman dirender.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kalau kamu cache string &lt;code dir=&quot;auto&quot;&gt;&quot;11 Rabiul Akhir 1448 H&quot;&lt;/code&gt; selama 1 jam, widget kamu bisa tetap nampilin tanggal lama sampai 1 jam setelah maghrib lewat. Kalau yang kamu cache respons JSON-nya, dan pilihan &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; vs &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; dilakukan saat render, tanggalnya tetap tepat waktu.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;error-yang-mungkin-muncul&quot;&gt;Error yang mungkin muncul&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Parameter &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt; menerima &lt;code dir=&quot;auto&quot;&gt;true&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;false&lt;/code&gt; (tidak peka huruf besar/kecil) dan &lt;code dir=&quot;auto&quot;&gt;1&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt;. Kalau kamu kirim nilai lain, misalnya &lt;code dir=&quot;auto&quot;&gt;next=yes&lt;/code&gt;, API akan menjawab:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;error&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;code&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;invalid_next&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;message&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;dengan HTTP status &lt;code dir=&quot;auto&quot;&gt;400&lt;/code&gt;. Jadi kalau tiba-tiba widget kamu kosong setelah menambah parameter ini, cek dulu nilainya.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;ringkasan&quot;&gt;Ringkasan&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Hari Hijriah dimulai saat &lt;strong&gt;maghrib&lt;/strong&gt;, bukan tengah malam, karena bulan baru ditentukan lewat hilal yang diperiksa saat matahari terbenam.&lt;/li&gt;
&lt;li&gt;Akibatnya, dari maghrib sampai tengah malam, tanggal Hijriah sudah “besok” padahal tanggal Masehi masih hari yang sama.&lt;/li&gt;
&lt;li&gt;Pakai &lt;code dir=&quot;auto&quot;&gt;?next=true&lt;/code&gt; di &lt;code dir=&quot;auto&quot;&gt;GET /today&lt;/code&gt; untuk mendapatkan objek &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;, yaitu tanggal Hijriah yang berlaku setelah maghrib malam ini.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API tidak menghitung waktu maghrib.&lt;/strong&gt; Kamu yang menentukan kapan berpindah dari &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; ke &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;, pakai waktu maghrib sesuai lokasi pengguna.&lt;/li&gt;
&lt;li&gt;Kirim &lt;code dir=&quot;auto&quot;&gt;tz&lt;/code&gt; yang sesuai, cek &lt;code dir=&quot;auto&quot;&gt;next.source&lt;/code&gt;, dan kalau kamu bikin cache sendiri, simpan respons mentah, bukan hasil akhirnya.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Coba sekarang:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&amp;#x26;next=true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dokumentasi lengkap endpoint ini ada di &lt;a href=&quot;https://mabims.dev/endpoints/today&quot;&gt;mabims.dev/endpoints/today&lt;/a&gt;. Pengguna non-developer bisa langsung melihat efek pergantian saat maghrib lewat &lt;a href=&quot;https://mabims.dev/kalender-hijriah/&quot;&gt;kalender Hijriah MABIMS&lt;/a&gt;. Kalau ada kasus yang belum tertangani atau kamu nemu tanggal yang terasa janggal, silakan buka issue di &lt;a href=&quot;https://github.com/PijarAdiluhung/mabims-api&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Semoga widget tanggal Hijriah kamu nggak pernah lagi telat sehari :)&lt;/p&gt;

</content:encoded><category>Tutorial</category><category>Hijriah</category><category>MABIMS</category><category>JavaScript</category><category>maghrib</category></item><item><title>Cara Integrasi MABIMS API ke Aplikasi iOS &amp; Android</title><link>https://mabims.dev/blog/integrasi-mabims-ios-android/</link><guid isPermaLink="true">https://mabims.dev/blog/integrasi-mabims-ios-android/</guid><description>Cara pasang kalender Hijriah kriteria MABIMS di app native iOS/Android biar tetap akurat walau offline, pakai pola cache /year + live /today, contoh Swift &amp; Kotlin.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Di &lt;a href=&quot;https://mabims.dev/blog/cara-tampilkan-tanggal-hijriah/&quot;&gt;post sebelumnya&lt;/a&gt; kita bahas cara nampilin tanggal Hijriah di website: tinggal fetch &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt;, cache sejam di server, selesai. Gampang, karena web itu asumsinya selalu online.&lt;/p&gt;
&lt;p&gt;App mobile beda cerita. User bisa buka app pas mode pesawat, di daerah sinyal lemah, atau bahkan sengaja mode offline. Kalau app cuma andelin &lt;code dir=&quot;auto&quot;&gt;fetch(&apos;/today&apos;)&lt;/code&gt; tanpa fallback, begitu offline ya tanggal Hijriah-nya nggak muncul sama sekali. Untuk widget masjid/pesantren atau app ibadah, itu masalah beneran, bukan cuma UX yang kurang mulus.&lt;/p&gt;
&lt;p&gt;Jadi buat native app (Swift/Kotlin), strateginya perlu 2 lapis: satu untuk kondisi online (akurat, real-time), satu untuk fallback offline (dari cache lokal).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kenapa-harus-mabims-bukan-umm-al-qura&quot;&gt;Kenapa Harus MABIMS (Bukan Umm al-Qura)?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau install library kalender Hijriah dari package manager, hampir semua defaultnya pakai kriteria &lt;a href=&quot;https://en.wikipedia.org/wiki/Umm_al-Qura_calendar&quot;&gt;Umm al-Qura&lt;/a&gt; (kalender resmi Arab Saudi), gampang ditemukan, dokumentasinya lengkap, tapi bisa beda ±1 hari dari tanggal yang diumumkan &lt;a href=&quot;https://kemenag.go.id&quot;&gt;Kemenag RI&lt;/a&gt;. Buat app yang dipakai user Indonesia (jadwal puasa, hari besar, dsb), selisih sehari itu bisa bikin awam. Ceritanya lebih lengkap ada di &lt;a href=&quot;https://mabims.dev/blog/kenapa-saya-bikin-mabims-dev/&quot;&gt;Cerita di Balik MABIMS API&lt;/a&gt;, soal kenapa post itu dan API ini dibuat.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;arsitektur-2-layer&quot;&gt;Arsitektur 2 Layer&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Layer 1: Cache tahunan (&lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt;) sebagai fallback offline&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fetch sekali:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/year?year=2026&amp;#x26;calendar=gregorian&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Pakai &lt;code dir=&quot;auto&quot;&gt;calendar=gregorian&lt;/code&gt; (bukan &lt;code dir=&quot;auto&quot;&gt;hijri&lt;/code&gt;), karena kalender Kemenag itu dipublikasikan per tahun Masehi (“Kalender 2026”), jadi lebih natural nyimpen &amp;#x26; nge-refresh per tahun Masehi juga. Satu fetch langsung dapet Januari-Desember lengkap, gampang di-lookup dari tanggal device yang juga Masehi.&lt;/p&gt;
&lt;p&gt;Simpan hasilnya lokal (&lt;a href=&quot;https://developer.android.com/training/data-storage/room&quot;&gt;Room&lt;/a&gt;/&lt;a href=&quot;https://developer.android.com/reference/android/content/SharedPreferences&quot;&gt;SharedPreferences&lt;/a&gt; di Android, atau file JSON + &lt;a href=&quot;https://developer.apple.com/documentation/foundation/userdefaults&quot;&gt;UserDefaults&lt;/a&gt; di iOS). Ini yang dipakai kalau app lagi offline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 2: &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; live setiap app dibuka &amp;#x26; online&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/today?tz={timezone_device}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ini source of truth paling akurat, karena bisa nangkep update data terbaru dari Kemenag. Alur baca di app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ada koneksi? → hit &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt;, tampilkan hasilnya.&lt;/li&gt;
&lt;li&gt;Gagal (timeout/no network)? → fallback: cari tanggal hari ini di cache &lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt; lokal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Network-first, bukan cache-first, karena &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; murah (response-nya kecil) dan sudah dilayani lewat CDN edge cache dengan TTL yang kedaluwarsa persis tengah malam lokal, jadi hampir nggak pernah nyampe origin.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kapan-refresh-cache-year&quot;&gt;Kapan Refresh Cache &lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt;?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Simpel: &lt;strong&gt;terjadwal sekali di akhir Desember&lt;/strong&gt;, fetch ulang &lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt; untuk tahun Masehi berikutnya (background task: &lt;a href=&quot;https://developer.apple.com/documentation/backgroundtasks/bgtaskrefresh&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;BGAppRefreshTask&lt;/code&gt;&lt;/a&gt; di iOS, &lt;a href=&quot;https://developer.android.com/reference/androidx/work/WorkManager&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;WorkManager&lt;/code&gt;&lt;/a&gt; periodic di Android).&lt;/p&gt;
&lt;p&gt;Satu catatan penting: pendekatan ini sengaja simpel dan cukup buat kebanyakan kasus, karena &lt;code dir=&quot;auto&quot;&gt;calendar=gregorian&lt;/code&gt; bikin siklus refresh-nya align sama tahun Masehi (bukan tahun Hijriah yang bergeser ~11 hari tiap tahun seperti kalau kita cache per tahun Hijriah). Tapi tetap kasih &lt;strong&gt;safety net&lt;/strong&gt;: kalau suatu saat &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; gagal dan hasil lookup dari cache ternyata nggak ketemu (data belum ke-refresh, atau app baru pertama kali dipasang lewat pertengahan tahun), trigger fetch &lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt; on-the-spot saat itu juga, jangan nunggu jadwal Desember berikutnya.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;contoh-kode-swift-ios&quot;&gt;Contoh Kode: Swift (iOS)&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Foundation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; HijriOutput: &lt;/span&gt;&lt;span&gt;Codable &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; date: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; day: &lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; month: &lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; month_name: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; year: &lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; TodayResponse: &lt;/span&gt;&lt;span&gt;Codable &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; output: HijriOutput&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; source: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; warnings: [&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; HijriRepository {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; baseURL &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; cacheKey &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri_year_cache&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; cacheYearKey &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri_year_cache_year&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Layer 2: live, dipanggil tiap app dibuka&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;func&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;today&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; (date: &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, warnings: [&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;]) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; tz &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; TimeZone.&lt;/span&gt;&lt;span&gt;current&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;identifier&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; url &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\(&lt;/span&gt;&lt;span&gt;baseURL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/today?tz=&lt;/span&gt;&lt;span&gt;\(&lt;/span&gt;&lt;span&gt;tz&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data, _&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; URLSession.shared.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;: url&lt;/span&gt;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;               &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; decoded &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSONDecoder&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TodayResponse.&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;: data&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;decoded.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;, decoded.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// fallback ke cache lokal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fallbackFromCache&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, [])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;func&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fallbackFromCache&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;guard&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; cached &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; UserDefaults.standard.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;forKey&lt;/span&gt;&lt;span&gt;: cacheKey&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// parse &amp;#x26; cari entry yang tanggal gregorian-nya == hari ini&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// (struktur /year: { months: { &quot;1&quot;: [...], &quot;2&quot;: [...] } })&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// ...lookup logic sesuai model kamu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// placeholder&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Layer 1: refresh tahunan, dipanggil dari BGAppRefreshTask akhir Desember&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// atau on-the-spot kalau fallback gagal nemu data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;func&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;refreshYearCache&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;guard&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; url &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\(&lt;/span&gt;&lt;span&gt;baseURL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/year?year=&lt;/span&gt;&lt;span&gt;\(&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;#x26;calendar=gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data, _&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; URLSession.shared.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;: url&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;UserDefaults.&lt;/span&gt;&lt;span&gt;standard&lt;/span&gt;&lt;span&gt;.set(&lt;/span&gt;&lt;span&gt;&lt;span&gt;data, &lt;/span&gt;&lt;span&gt;forKey&lt;/span&gt;&lt;span&gt;: cacheKey&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;UserDefaults.&lt;/span&gt;&lt;span&gt;standard&lt;/span&gt;&lt;span&gt;.set(&lt;/span&gt;&lt;span&gt;&lt;span&gt;year, &lt;/span&gt;&lt;span&gt;forKey&lt;/span&gt;&lt;span&gt;: cacheYearKey&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Daftarin refresh task di &lt;code dir=&quot;auto&quot;&gt;AppDelegate&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;SceneDelegate&lt;/code&gt; pakai &lt;code dir=&quot;auto&quot;&gt;BGTaskScheduler&lt;/code&gt;, jadwalin sekali per tahun sekitar 28–31 Desember.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;contoh-kode-kotlin-android&quot;&gt;Contoh Kode: Kotlin (Android)&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; HijriOutput(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; date: String, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; day: Int, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; month: Int,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; month_name: String, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; year: Int&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; TodayResponse(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; output: HijriOutput, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; source: String, &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; warnings: List&amp;#x3C;String&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; HijriRepository(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; api: MabimsApi, &lt;/span&gt;&lt;span&gt;// Retrofit interface&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; prefs: SharedPreferences&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Layer 2: live, dipanggil tiap app dibuka&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;suspend&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;today&lt;/span&gt;&lt;span&gt;(): Pair&amp;#x3C;String, List&amp;#x3C;String&gt;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; tz &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; java.util.TimeZone.&lt;/span&gt;&lt;span&gt;getDefault&lt;/span&gt;&lt;span&gt;().id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; response &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; api.&lt;/span&gt;&lt;span&gt;getToday&lt;/span&gt;&lt;span&gt;(tz &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; tz)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;response.output.date to response.warnings&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (e: Exception) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;fallbackFromCache&lt;/span&gt;&lt;span&gt;() ?: (&lt;/span&gt;&lt;span&gt;&quot;-&quot;&lt;/span&gt;&lt;span&gt; to &lt;/span&gt;&lt;span&gt;emptyList&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fallbackFromCache&lt;/span&gt;&lt;span&gt;(): Pair&amp;#x3C;String, List&amp;#x3C;String&gt;&gt;? {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; cachedJson &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; prefs.&lt;/span&gt;&lt;span&gt;getString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hijri_year_cache&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;) ?: &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// lookup tanggal gregorian hari ini dari cached JSON (/year response)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// placeholder, parsing sesuai model kamu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// Layer 1: refresh tahunan via WorkManager, akhir Desember&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// atau on-the-spot kalau fallback gagal nemu data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;suspend&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fun&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;refreshYearCache&lt;/span&gt;&lt;span&gt;(year: Int) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt; response &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; api.&lt;/span&gt;&lt;span&gt;getYear&lt;/span&gt;&lt;span&gt;(year &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; year, calendar &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;gregorian&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prefs.&lt;/span&gt;&lt;span&gt;edit&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;putString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hijri_year_cache&quot;&lt;/span&gt;&lt;span&gt;, response.&lt;/span&gt;&lt;span&gt;toRawJson&lt;/span&gt;&lt;span&gt;()).&lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prefs.&lt;/span&gt;&lt;span&gt;edit&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;putInt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;hijri_year_cache_year&quot;&lt;/span&gt;&lt;span&gt;, year).&lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Schedule-in lewat &lt;code dir=&quot;auto&quot;&gt;WorkManager&lt;/code&gt; periodic request (interval 1 tahun, atau lebih praktis: one-time request yang di-reschedule tiap kali jalan, dipicu sekitar akhir Desember).&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;edge-case-yang-wajib-dipikirin&quot;&gt;Edge Case yang Wajib Dipikirin&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;First launch tanpa internet sama sekali.&lt;/strong&gt; Kalau app baru diinstall dan langsung dibuka offline, cache &lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt; belum ada. Opsinya: bundle snapshot data minimal di dalam app (assets/&lt;code dir=&quot;auto&quot;&gt;res/raw&lt;/code&gt; di Android, bundle resource di iOS), atau paksa user online sekali di onboarding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timezone.&lt;/strong&gt; Jangan hardcode &lt;code dir=&quot;auto&quot;&gt;Asia/Jakarta&lt;/code&gt;. Ambil dari &lt;code dir=&quot;auto&quot;&gt;TimeZone.current.identifier&lt;/code&gt; (Swift) atau &lt;code dir=&quot;auto&quot;&gt;TimeZone.getDefault().id&lt;/code&gt; (Kotlin), kirim sebagai param &lt;code dir=&quot;auto&quot;&gt;tz&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Field &lt;code dir=&quot;auto&quot;&gt;warnings&lt;/code&gt;.&lt;/strong&gt; Kalau nggak kosong (misalnya tanggal deket ambang visibilitas hilal), tampilkan indikator kecil di UI, misalnya “bisa geser 1 hari dari pengumuman resmi”, biar user nggak kaget kalau nanti ada revisi.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;bonus-pakai-react-nativeexpo&quot;&gt;Bonus: Pakai React Native/Expo?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau stack-nya React Native, alternatif yang lebih simpel: pakai package &lt;strong&gt;&lt;a href=&quot;https://mabims.dev/sdk&quot;&gt;mabims-hijri&lt;/a&gt;&lt;/strong&gt;, data 2023-2026 udah dibundle langsung di package, jadi nggak perlu arsitektur cache manual sama sekali untuk kasus umum.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm install mabims-hijri&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;penutup&quot;&gt;Penutup&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Referensi lengkap tiap endpoint ada di:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mabims.dev/quickstart&quot;&gt;Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mabims.dev/endpoints/today&quot;&gt;GET /today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mabims.dev/endpoints/month-year&quot;&gt;GET /month &amp;#x26; /year&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kalau app kamu butuh rate limit lebih tinggi atau SLA (misal buat app skala besar), hubungi &lt;a href=&quot;mailto:halo@pixostudio.id&quot;&gt;halo@pixostudio.id&lt;/a&gt;.&lt;/p&gt;

</content:encoded><category>Integrasi</category><category>Tutorial</category><category>Mobile</category><category>Hijriah</category><category>MABIMS</category><category>Swift</category><category>Kotlin</category></item><item><title>Visibilitas Hilal Rabiul Akhir 1448 H</title><link>https://mabims.dev/blog/review-visibilitas-rabiul-akhir-1448/</link><guid isPermaLink="true">https://mabims.dev/blog/review-visibilitas-rabiul-akhir-1448/</guid><description>Hilal Rabiul Akhir 1448 H belum memenuhi kriteria Neo MABIMS.</description><pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Apakah &lt;strong&gt;Rabiul Awal 1448 H&lt;/strong&gt; berlangsung 29 hari atau 30 hari? Mari kita lihat datanya.&lt;/p&gt;
&lt;p&gt;Untuk menjawab pertanyaan itu, kita perlu melihat keadaan &lt;a href=&quot;https://en.wikipedia.org/wiki/Hilal&quot;&gt;hilal&lt;/a&gt; pada sore &lt;strong&gt;11 September 2026&lt;/strong&gt;, bertepatan dengan 29 Rabiul Awal 1448 H. Jika hilal belum memenuhi kriteria, secara perhitungan bulan berjalan digenapkan menjadi 30 hari dan Rabiul Akhir dimulai setelahnya.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;melihat-petanya-dulu&quot;&gt;Melihat petanya dulu&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&quot;Peta visibilitas hilal Rabiul Akhir 1448 H&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;1280&quot; src=&quot;https://mabims.dev/_astro/1448-04-map.BFUQXv60_Z1R0mJT.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Saya mulai dari peta karena gambaran besarnya langsung terlihat. Tidak ada titik yang memenuhi kriteria, sedangkan &lt;strong&gt;95 titik tidak memenuhi&lt;/strong&gt;. Lokasi dengan hasil paling baik adalah &lt;strong&gt;Meulaboh Coast&lt;/strong&gt;, di pesisir barat Aceh. Bahkan di sana pun hasilnya masih belum cukup.&lt;/p&gt;
&lt;p&gt;Peta ini memeriksa wilayah Indonesia dari banyak titik. Jadi, kesimpulannya bukan hanya karena pengamatan di satu tempat kurang baik. Pada sore itu, Bulan memang masih terlalu rendah dan terlalu dekat dengan Matahari di seluruh wilayah yang diperiksa.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;lalu-apa-yang-terjadi-di-langit&quot;&gt;Lalu, apa yang terjadi di langit?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&quot;Gambar langit hilal Rabiul Akhir 1448 H&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;720&quot; height=&quot;1280&quot; src=&quot;https://mabims.dev/_astro/1448-04-viz.DkEVjDFB_Zgg84n.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Gambar langit membantu menjelaskan angka-angka di peta. Di Meulaboh Coast, ketinggian Bulan hanya &lt;strong&gt;1,4°&lt;/strong&gt;. Jarak sudutnya dari Matahari juga baru &lt;strong&gt;4,8°&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Padahal, kriteria Neo MABIMS mensyaratkan ketinggian Bulan minimal &lt;strong&gt;3,0°&lt;/strong&gt; dan jarak sudut (elongasi) minimal &lt;strong&gt;6,4°&lt;/strong&gt;. Kedua syarat ini harus terpenuhi sekaligus. Karena keduanya belum tercapai, gambar tersebut menampilkan status &lt;strong&gt;TIDAK MEMENUHI&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sebagai pengingat, angka 3 dan 6,4 derajat ini adalah hasil penelitian ratusan pengamatan hilal (lihat &lt;a href=&quot;https://www.antaranews.com/berita/5484670/perkembangan-kriteria-mabims-dalam-penentuan-awal-bulan-hijriah&quot;&gt;ANTARA&lt;/a&gt; dan &lt;a href=&quot;https://jurnal.umsu.ac.id/index.php/almarshad/article/download/17139/11526&quot;&gt;Jurnal Al-Marshad&lt;/a&gt;). Kesimpulannya? Di bawah angka tersebut hilal mustahil dilihat dengan mata telanjang maupun dengan alat bantu teleskop.&lt;/p&gt;
&lt;p&gt;Keadaan di ufuk juga kurang mendukung. Matahari terbenam pukul &lt;strong&gt;18.36&lt;/strong&gt;, sementara Bulan terbenam pukul &lt;strong&gt;18.41&lt;/strong&gt;. Waktu pengamatannya hanya sekitar &lt;strong&gt;lima menit&lt;/strong&gt;. Bagian Bulan yang disinari Matahari pun baru &lt;strong&gt;0,1 persen&lt;/strong&gt;, sehingga sabitnya masih sangat tipis.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kesimpulan&quot;&gt;Kesimpulan&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Dari data ini, Rabiul Awal 1448 H belum memenuhi kriteria Neo MABIMS pada sore 11 September 2026. Dengan demikian, menurut kriteria tersebut, Rabiul Awal digenapkan menjadi 30 hari dan awal Rabiul Akhir jatuh setelahnya.&lt;/p&gt;
&lt;p&gt;Ini adalah hasil perhitungan visibilitas, bukan keputusan resmi penetapan awal bulan. Keputusan resmi tetap mengikuti proses rukyat dan &lt;a href=&quot;https://en.wikipedia.org/wiki/Moon_sighting&quot;&gt;sidang isbat&lt;/a&gt; oleh pihak yang berwenang.&lt;/p&gt;
&lt;p&gt;Data lengkap tersedia melalui &lt;a href=&quot;https://api.mabims.dev/api/v1/hilal/info?month=4&amp;#x26;year=1448&quot;&gt;data hilal MABIMS&lt;/a&gt; dan &lt;a href=&quot;https://api.mabims.dev/api/v1/hilal/viz?month=4&amp;#x26;year=1448&quot;&gt;visualisasi hilal&lt;/a&gt;. Mau memeriksa bulan lain? Buka &lt;a href=&quot;https://mabims.dev/kalender-hijriah/&quot;&gt;kalender Hijriah&lt;/a&gt; dan lihat periode masing-masing bulan beserta data hilalnya.&lt;/p&gt;
</content:encoded><category>Hilal</category><category>Astronomi</category><category>MABIMS</category></item><item><title>Bedah mabims-computed: Apa yang Terjadi di Balik Layar?</title><link>https://mabims.dev/blog/deep-dive-mabims-computed/</link><guid isPermaLink="true">https://mabims.dev/blog/deep-dive-mabims-computed/</guid><description>Kalau tanggal yang kamu minta berada di luar tabel Kemenag, MABIMS API tidak menebak secara acak. API menghitung ulang panjang bulan berdasarkan kriteria Neo MABIMS. Tulisan ini membedah mesin di balik source mabims-computed.</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Di beberapa bagian dokumentasi MABIMS API, saya menyebut &lt;code dir=&quot;auto&quot;&gt;source: &quot;mabims-computed&quot;&lt;/code&gt; sebagai fallback.&lt;/p&gt;
&lt;p&gt;Di tulisan ini kita akan melihat cara kerjanya lebih dekat. &lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; bukan sekadar “kalau datanya tidak ada, pakai perkiraan”. Di baliknya ada mesin kecil yang menghitung awal bulan Hijriah, berjalan maju atau mundur dari sebuah tanggal acuan, menyimpan hasil perhitungan, lalu memberi tahu aplikasi bahwa data yang diterima bukan data resmi Kemenag.&lt;/p&gt;
&lt;p&gt;Saya akan membahas bagian-bagian yang biasanya tidak terlihat dari luar: bagaimana mesin menentukan sebuah bulan memiliki 29 atau 30 hari, mengapa ketinggian hilal dihitung secara &lt;a href=&quot;https://en.wikipedia.org/wiki/Horizontal_coordinate_system&quot;&gt;toposentris&lt;/a&gt; sementara elongasi tetap &lt;a href=&quot;https://en.wikipedia.org/wiki/Barycentric_coordinates_(astronomy)&quot;&gt;geosentris&lt;/a&gt;, dan mengapa kriteria tersebut diperiksa di 25 titik pengamatan pesisir.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dua-jenis-data-satu-api&quot;&gt;Dua jenis data, satu API&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;MABIMS API memiliki dua sumber data utama:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;mabims&lt;/code&gt; — tanggal dari kalender publik Kemenag RI.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; — tanggal yang dihitung menggunakan kriteria Neo MABIMS ketika tanggal tersebut berada di luar cakupan tabel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contoh tanggal yang masih tersedia di dalam tabel:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1447-09-01&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Ramadhan&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1447&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Kamis&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kalau tanggal yang diminta sudah berada di luar tabel, bentuk responsnya tetap sama. Yang berubah adalah sumber datanya:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1450-01-01&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Muharram&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1450&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Jumat&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims-computed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Date is outside the curated MABIMS table; computed with the Neo MABIMS criteria (moon altitude &gt;= 3 deg and elongation &gt;= 6.4 deg at local sunset, seen anywhere across the coastal observation sites of Indonesia).&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kedua sumber ini sengaja dibedakan. Hasil perhitungan tetap berguna untuk kalender aplikasi, tetapi tidak boleh dianggap sebagai pengumuman resmi atau pengganti sidang isbat.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;neo-mabims-dalam-dua-angka&quot;&gt;Neo MABIMS dalam dua angka&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Versi singkat kriteria &lt;a href=&quot;https://mui.or.id/baca/berita/mengenal-kriteria-hilal-mabims-standard-penentuan-awal-bulan-hijriyah-pemerintah-indonesia&quot;&gt;Neo MABIMS&lt;/a&gt; adalah:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ketinggian hilal &gt;= 3.0°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;elongasi         &gt;= 6.4°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kedua syarat tersebut harus terpenuhi secara bersamaan, dan cukup terpenuhi di &lt;strong&gt;satu titik pengamatan saja&lt;/strong&gt;. Kalo cuma ketinggian hilal yang memenuhi syarat, tetapi elongasinya belum cukup = kriterianya belum terpenuhi. Begitu juga sebaliknya. (Lihat juga liputan &lt;a href=&quot;https://www.antaranews.com/berita/5484670/perkembangan-kriteria-mabims-dalam-penentuan-awal-bulan-hijriah&quot;&gt;ANTARA&lt;/a&gt; dan &lt;a href=&quot;https://jurnal.umsu.ac.id/index.php/almarshad/article/download/17139/11526&quot;&gt;Jurnal Al-Marshad&lt;/a&gt; tentang kriteria ini.)&lt;/p&gt;
&lt;p&gt;Kriteria ini diperiksa saat &lt;strong&gt;matahari terbenam di masing-masing titik pengamatan&lt;/strong&gt;. Saat ini ada &lt;strong&gt;25 titik pengamatan pesisir&lt;/strong&gt; dari Sabang sampai Rote; daftar lengkapnya tersedia di &lt;a href=&quot;https://github.com/PijarAdiluhung/mabims-api/blob/main/api/data/hilal_sites.json&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;api/data/hilal_sites.json&lt;/code&gt;&lt;/a&gt;. Polanya menarik: pada bulan-bulan yang kondisinya cukup aman, titik paling barat hampir selalu menjadi penentu. Semakin ke barat, matahari terbenam semakin lambat, sehingga hilal berada lebih tinggi di atas horizon saat senja. Namun, pada bulan-bulan ketika deklinasi Bulan berada di selatan, jalur titik-titik di selatan, dari Jawa bagian selatan sampai Nusa Tenggara, bisa menjadi penentu. Itu sebabnya titik-titik selatan juga perlu diperiksa.&lt;/p&gt;
&lt;p&gt;Ini bukan berarti Sabang selalu menjadi patokan. Logikanya sama dengan rukyah Kemenag: selama hilal terlihat di wilayah Indonesia, bulan baru dimulai. API bahkan melaporkan titik yang menjadi penentu melalui field &lt;code dir=&quot;auto&quot;&gt;deciding_site&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;dari-hilal-ke-panjang-bulan&quot;&gt;Dari hilal ke panjang bulan&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Perhitungan panjang bulan sebenarnya bisa diringkas dalam fungsi kecil:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;month_length&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;month_start&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;criteria_on_day29&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;month_start&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;29&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; result.visible &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;criteria_on_day29()&lt;/code&gt; memeriksa kondisi saat matahari terbenam pada malam ke-29 bulan yang sedang berjalan. Kalau kedua kriteria terpenuhi, bulan tersebut selesai setelah 29 hari. Kalau tidak, bulan digenapkan menjadi 30 hari.&lt;/p&gt;
&lt;p&gt;Artinya, untuk menentukan awal Ramadan, yang diperiksa bukan malam pertama Ramadan. Yang diperiksa adalah malam ke-29 Sya’ban. Kalau hilal memenuhi kriteria, hari berikutnya adalah 1 Ramadan. Kalau tidak, Sya’ban berlangsung selama 30 hari.&lt;/p&gt;
&lt;p&gt;Alurnya kira-kira seperti ini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;awal bulan Hijriah yang sudah diketahui&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;periksa matahari terbenam pada malam ke-29&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ketinggian &gt;= 3° dan elongasi &gt;= 6.4°?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↙                         ↘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ya                          tidak&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bulan 29 hari                bulan 30 hari&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓                          ↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;awal bulan berikutnya = awal + panjang bulan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Karena setiap bulan dimulai setelah bulan sebelumnya berakhir, mesin ini dapat menyusun kalender secara berantai.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bukan-konversi-aritmetika-biasa&quot;&gt;Bukan konversi aritmetika biasa&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Tabular_Islamic_calendar&quot;&gt;Kalender Hijriah tabular&lt;/a&gt; biasanya dapat dihitung dengan pola aritmetika: setiap bulan memiliki susunan 29 dan 30 hari tertentu, lalu siklus tahun kabisat menentukan penempatannya.&lt;/p&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; tidak bekerja seperti itu. Panjang bulan ditentukan satu per satu berdasarkan kondisi astronomis pada malam ke-29. Jadi, cara kerjanya lebih mirip linked list daripada rumus satu baris:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;1449-01-01&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ periksa hilal → 29 atau 30 hari&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ 1449-02-01&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ periksa hilal → 29 atau 30 hari&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;               &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ 1449-03-01&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Konsekuensinya, mesin ini membutuhkan satu titik awal yang tepercaya. Di aplikasi, titik tersebut berasal dari batas tabel resmi Kemenag RI. Untuk tanggal setelah batas tabel, mesin berjalan maju dari tanggal acuan itu.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bisa-berjalan-mundur-juga&quot;&gt;Bisa berjalan mundur juga&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Untuk tanggal sebelum kalender resmi, API tidak langsung mengizinkan perhitungan. Request harus menyertakan &lt;code dir=&quot;auto&quot;&gt;retro=true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Alasannya sederhana: kriteria Neo MABIMS baru diperkenalkan pada 2022. Kalau kriteria tersebut diterapkan ke tahun 1990, hasilnya bukan data historis resmi. Hasil itu adalah rekonstruksi menggunakan aturan yang berlaku sekarang.&lt;/p&gt;
&lt;p&gt;Karena itu, ada sumber data ketiga:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;source: &quot;mabims-retro&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Label ini berarti tanggal tersebut dihitung mundur menggunakan kriteria yang sama, bukan diambil dari tabel resmi masa lalu. API juga memberikan warning agar perbedaan status ini tidak hilang ketika respons diteruskan ke aplikasi.&lt;/p&gt;
&lt;p&gt;Secara internal, berjalan mundur sedikit lebih rumit daripada berjalan maju. Kalau kita mengetahui tanggal 1 bulan berikutnya, kita perlu memeriksa waktu matahari terbenam pada hari ke-31 sebelumnya untuk menentukan apakah bulan sebelumnya memiliki 29 atau 30 hari. Setelah itu, awal bulan sebelumnya bisa ditentukan.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bagian-yang-membuat-saya-harus-menyelidiki-ulang&quot;&gt;Bagian yang membuat saya harus menyelidiki ulang&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Awalnya saya mengira pertanyaannya sederhana: untuk menghitung kriteria hilal, sebaiknya kita memakai koordinat pengamat di permukaan Bumi atau posisi yang dihitung dari pusat Bumi?&lt;/p&gt;
&lt;p&gt;Istilahnya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Horizontal_coordinate_system&quot;&gt;Toposentris&lt;/a&gt;&lt;/strong&gt; — dilihat dari permukaan Bumi, dengan memperhitungkan posisi pengamat dan paralaks Bulan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Barycentric_coordinates_(astronomy)&quot;&gt;Geosentris&lt;/a&gt;&lt;/strong&gt; — dilihat dari pusat Bumi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Secara intuisi, pendekatan toposentris memang lebih masuk akal untuk pengamatan hilal karena manusia mengamati dari permukaan Bumi. Setelah saya validasi ulang dari awal sampai akhir, intuisi itu ternyata benar. Mesin ini menggunakan ketinggian hilal &lt;strong&gt;secara toposentris&lt;/strong&gt; (dengan koreksi &lt;a href=&quot;https://en.wikipedia.org/wiki/Atmospheric_refraction&quot;&gt;refraksi atmosfer&lt;/a&gt;) di &lt;strong&gt;25 titik pengamatan pesisir&lt;/strong&gt; dari Sabang sampai Rote. Elongasi tetap dihitung &lt;strong&gt;secara geosentris&lt;/strong&gt;, sesuai konvensi hisab Indonesia. Kriteria cukup terpenuhi di satu titik mana pun.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kondisi-borderline-itu-nyata&quot;&gt;Kondisi borderline itu nyata&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kembali ke perhitungannya. Memenuhi kriteria bukan berarti posisinya jauh di atas ambang batas.&lt;/p&gt;
&lt;p&gt;Misalnya hasilnya seperti ini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;altitude  = 3.12°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;elongation = 7.01°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Secara boolean, hasil tersebut memenuhi kriteria. Namun, jarak terdekatnya dari ambang batas ketinggian hanya 0,12°. Karena itu, provider menyimpan margin terkecil:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;margin &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;min&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;altitude &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;elongation &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6.4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kalau margin tersebut positif tetapi kurang dari 0,25°, bulan ditandai sebagai borderline. Informasi ini dimasukkan ke &lt;code dir=&quot;auto&quot;&gt;warnings[]&lt;/code&gt; agar aplikasi tidak menganggap hasil yang sangat dekat dengan ambang batas sebagai sesuatu yang sepenuhnya pasti.&lt;/p&gt;
&lt;p&gt;Catatan penting: borderline bukan berarti hasilnya otomatis salah. Artinya, perubahan kecil pada lokasi, metode, data &lt;a href=&quot;https://ssd.jpl.nasa.gov/planets/eph_export.html&quot;&gt;ephemeris&lt;/a&gt;, atau cara menafsirkan kriteria dapat memengaruhi hasil.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kapan-mabims-computed-boleh-digunakan&quot;&gt;Kapan &lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; boleh digunakan?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Menurut saya, &lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; cocok digunakan untuk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kalender aplikasi yang membutuhkan cakupan tahun lebih panjang;&lt;/li&gt;
&lt;li&gt;pratinjau tanggal hari besar di masa depan;&lt;/li&gt;
&lt;li&gt;fitur konversi tanggal yang belum memiliki tabel resmi;&lt;/li&gt;
&lt;li&gt;riset, eksperimen, dan visualisasi hilal;&lt;/li&gt;
&lt;li&gt;fallback teknis ketika data resmi belum tersedia.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jangan memperlakukannya sebagai:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pengumuman resmi awal Ramadan atau Idul Fitri;&lt;/li&gt;
&lt;li&gt;pengganti &lt;a href=&quot;https://en.wikipedia.org/wiki/Moon_sighting&quot;&gt;sidang isbat&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;bukti bahwa hilal benar-benar diamati di lokasi tertentu;&lt;/li&gt;
&lt;li&gt;satu-satunya sumber untuk mengambil keputusan administratif atau keagamaan.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Di sisi aplikasi, setidaknya selalu periksa dua field berikut:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims-computed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Tanggal ini adalah estimasi algoritmik, bukan data resmi.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;intinya&quot;&gt;Intinya&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; adalah sebuah kompromi yang dibuat secara sadar:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tabel resmi digunakan selama datanya tersedia.&lt;/li&gt;
&lt;li&gt;Di luar cakupan tabel, panjang bulan dihitung berdasarkan kriteria Neo MABIMS.&lt;/li&gt;
&lt;li&gt;Kriteria diperiksa saat matahari terbenam di masing-masing dari 25 titik pengamatan pesisir; cukup satu titik yang memenuhi syarat.&lt;/li&gt;
&lt;li&gt;Dua ambang, yaitu ketinggian 3° dan elongasi 6,4°, harus terpenuhi secara bersamaan.&lt;/li&gt;
&lt;li&gt;Ketinggian hilal dihitung secara toposentris dengan koreksi refraksi, sedangkan elongasi tetap geosentris. Model ini tervalidasi 48 dari 48 kasus terhadap tabel kurasi.&lt;/li&gt;
&lt;li&gt;Hasilnya diberi label dan warning agar tidak disalahartikan sebagai data resmi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kalau kamu hanya memanggil &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt;, semua kerumitan ini memang tidak perlu terlihat. Namun, saat kamu meminta kalender untuk tahun 2050 atau bertanya mengapa satu bulan memiliki 29 hari sementara bulan lainnya 30 hari, inilah proses yang berlangsung di balik layar.&lt;/p&gt;
&lt;p&gt;Coba sendiri:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/events?year=2050&amp;#x26;calendar=gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Perhatikan field &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt; dan &lt;code dir=&quot;auto&quot;&gt;warnings&lt;/code&gt; pada responsnya. Dokumentasi endpoint dan status cakupan data tersedia di &lt;a href=&quot;https://mabims.dev/data-sources&quot;&gt;mabims.dev/data-sources&lt;/a&gt;.&lt;/p&gt;

</content:encoded><category>MABIMS</category><category>Astronomi</category><category>Backend</category><category>Python</category><category>Deep Dive</category></item><item><title>Tanggal Hijriah, Sekarang Offline: Memperkenalkan mabims-hijri</title><link>https://mabims.dev/blog/introducing-mabims-hijri-sdk/</link><guid isPermaLink="true">https://mabims.dev/blog/introducing-mabims-hijri-sdk/</guid><description>Kalau kamu cuma butuh tanggal Hijriah hari ini di website, REST API sudah cukup. Tapi kalau aplikasimu harus jalan offline, atau kamu capek manage rate limits? Kenalan sama mabims-hijri.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Kalau kamu cuma butuh tanggal Hijriah hari ini di website, &lt;a href=&quot;https://mabims.dev/blog/cara-pakai-mabims-api&quot;&gt;REST API&lt;/a&gt; sudah cukup. Tinggal &lt;code dir=&quot;auto&quot;&gt;fetch&lt;/code&gt;, parse JSON, selesai.&lt;/p&gt;
&lt;p&gt;Tapi setelah bikin beberapa pakai API itu, saya selalu nemu masalah yang sama:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Setiap load page nge-hit API.&lt;/strong&gt; Padahal tanggal Hijriah nggak berubah tiap beberapa detik.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate limits oke, tapi tetap ada batasnya.&lt;/strong&gt; Kalau site-mu lagi traffic naik, atau banyak component yang fetch tanggal yang sama…&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline nggak ada.&lt;/strong&gt; Bikin &lt;a href=&quot;https://web.dev/progressive-web-apps/&quot;&gt;PWA&lt;/a&gt; atau mobile app? Nggak ada tanggal Hijriah tanpa koneksi internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caching jadi urusanmu.&lt;/strong&gt; Kamu harus bikin caching layer sendiri, handle data stale, dan tentuin TTL-nya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Makanya saya bikin &lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/mabims-hijri&quot;&gt;mabims-hijri&lt;/a&gt;&lt;/strong&gt;, paket npm offline-first yang bundle data MABIMS 2024-2026 langsung di dalamnya.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;apa-yang-dilakukan&quot;&gt;Apa yang dilakukan&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Bundled MABIMS (2024-2026)  --&gt;  Local cache  --&gt;  Live API (fallback)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~70KB, built-in              TTL 24h          only when out of range&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Data MABIMS 2024-2026 di-bundle langsung di dalam package (~70KB)&lt;/li&gt;
&lt;li&gt;Kalau online, SDK cek &lt;code dir=&quot;auto&quot;&gt;/meta&lt;/code&gt; buat data yang lebih baru dan auto-sync&lt;/li&gt;
&lt;li&gt;Kalau tanggal di luar range bundle, fallback ke live API&lt;/li&gt;
&lt;li&gt;Semua operasi &lt;code dir=&quot;auto&quot;&gt;today()&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;convert()&lt;/code&gt;, dan &lt;code dir=&quot;auto&quot;&gt;range()&lt;/code&gt; jalan tanpa internet&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nggak perlu API key. Nggak perlu registrasi. Tinggal &lt;code dir=&quot;auto&quot;&gt;npm install&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;quick-start&quot;&gt;Quick start&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mabims-hijri&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { today, convert } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;mabims-hijri&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Tanggal Hijriah hari ini, jalan offline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;today&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;// Konversi tanggal tertentu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;ramadhan&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;convert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;2026-02-19&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(ramadhan&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;// &apos;Ramadhan&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Gitu aja. Nggak perlu base URL, nggak perlu headers, nggak perlu fetch wrapper. Datanya sudah ada di dalam app.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;sdk-vs-rest-api-kapan-pakai-yang-mana&quot;&gt;SDK vs REST API: Kapan pakai yang mana?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Saya masih ngerasa REST API itu pilihan yang tepat buat banyak kasus. Ini cara saya membedakannya:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pakai REST API kalau:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kamu butuh hilal sky chart (&lt;code dir=&quot;auto&quot;&gt;/hilal/viz&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Kamu butuh data di luar 2024-2026 dan nggak mau bundle&lt;/li&gt;
&lt;li&gt;Kamu bikin server-side integration di mana kamu manage caching sendiri&lt;/li&gt;
&lt;li&gt;Kamu mau pakai OpenAPI spec lengkap dan code generation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pakai SDK kalau:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kamu cuma butuh tanggal hari ini, konversi, atau events di app JS/TS&lt;/li&gt;
&lt;li&gt;Kamu mau support offline (PWA, mobile app, jaringan nggak stabil)&lt;/li&gt;
&lt;li&gt;Kamu mau zero-config, nggak perlu fetch wrapper, nggak perlu caching logic&lt;/li&gt;
&lt;li&gt;Kamu capek manage rate limits buat data yang sama&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contohnya, di React app:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { useState, useEffect } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;react&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { today, &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; HijriDate } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;mabims-hijri&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HijriDate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const [&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;useState&lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;HijriDate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;useEffect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;today&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;(res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; []);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;date) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Loading...&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Nggak perlu manage API URL. Nggak perlu debug loading state. Tinggal import dan pakai.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;isi-sdk-nya&quot;&gt;Isi SDK-nya&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;th&gt;Fungsinya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;today()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tanggal Hijriah hari ini, timezone-aware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;convert(date)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Konversi satu tanggal, dua arah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;range(start, end)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Konversi bulk (maks 45 hari)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;month(year, month)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semua hari dalam satu bulan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;year(year)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semua hari dalam satu tahun (12 bulan)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;events(year)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hari besar Islam (Ramadhan, Idul Fitri, dll.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code dir=&quot;auto&quot;&gt;hilal.info(month, year)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data visibilitas hilal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Semua ini jalan offline selama tanggal masih di dalam range yang di-bundle.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;catatan-untuk-react-native&quot;&gt;Catatan untuk React Native&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau kamu bikin React Native app, kamu perlu set storage adapter biar caching-nya persisten (pakai &lt;a href=&quot;https://react-native-async-storage.github.io/async-storage/&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@react-native-async-storage/async-storage&lt;/code&gt;&lt;/a&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { setStorageAdapter } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;mabims-hijri&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; AsyncStorage &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@react-native-async-storage/async-storage&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RNStorage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;implements&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;StorageAdapter&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; prefix &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;mabims_&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; AsyncStorage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getItem&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; key); }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; AsyncStorage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setItem&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; key, value); }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; AsyncStorage&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getItem&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; key)) &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;setStorageAdapter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RNStorage&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Tanpa ini, cache reset tiap kali app restart.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;intinya&quot;&gt;Intinya&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau kebutuhan Hijriah di app-mu cuma “tampilin tanggal hari ini di header,” jangan bikin caching layer, jangan bikin fetch wrapper, dan jangan pusing soal rate limits.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mabims-hijri&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Satu import, satu fungsi, selesai, online atau offline.&lt;/p&gt;
&lt;p&gt;Dokumentasi lengkap ada di &lt;a href=&quot;https://mabims.dev/sdk/&quot;&gt;mabims.dev/sdk&lt;/a&gt;. Source code di GitHub: &lt;a href=&quot;https://github.com/PijarAdiluhung/mabims-hijri&quot;&gt;PijarAdiluhung/mabims-hijri&lt;/a&gt;.&lt;/p&gt;

</content:encoded><category>SDK</category><category>JavaScript</category><category>TypeScript</category><category>Hijriah</category><category>Offline</category></item><item><title>Kalender Kemenag 2026: Jadwal Lengkap Tanggal Hijriah &amp; Hari Libur</title><link>https://mabims.dev/blog/kalender-kemenag-2026/</link><guid isPermaLink="true">https://mabims.dev/blog/kalender-kemenag-2026/</guid><description>Jadwal lengkap kalender Hijriah 1447–1448 H resmi Kemenag RI untuk tahun 2026. Tanggal Idul Fitri, Idul Adha, Isra Mikraj, dan semua hari libur nasional.</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Berikut jadwal lengkap kalender Hijriah tahun 2026 dari &lt;a href=&quot;https://kemenag.go.id&quot;&gt;&lt;strong&gt;Ditjen Bimbingan Masyarakat Islam, Kementerian Agama RI&lt;/strong&gt;&lt;/a&gt;. Kalender ini menjadi acuan utama tanggal-tanggal keagamaan Islam di Indonesia, termasuk hari-hari besar nasional dan cuti bersama. Penentuan awal bulannya menggunakan kriteria &lt;a href=&quot;https://mui.or.id/baca/berita/mengenal-kriteria-hilal-mabims-standard-penentuan-awal-bulan-hijriyah-pemerintah-indonesia&quot;&gt;MABIMS&lt;/a&gt; terbaru: tinggi hilal ≥ 3° dan elongasi ≥ 6,4°.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;tanggal-tanggal-penting-islam-2026&quot;&gt;Tanggal-tanggal Penting Islam 2026&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tanggal Masehi&lt;/th&gt;
&lt;th&gt;Peristiwa&lt;/th&gt;
&lt;th&gt;Tanggal Hijriah&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16 Januari 2026&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Isra%27_and_Mi%27raj&quot;&gt;Isra Mikraj&lt;/a&gt; Nabi Muhammad ﷺ&lt;/td&gt;
&lt;td&gt;27 Rajab 1447 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21–22 Maret 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Eid_al-Fitr&quot;&gt;Hari Raya Idul Fitri&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1–2 Shawwal 1447 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27 Mei 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Eid_al-Adha&quot;&gt;Hari Raya Idul Adha&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 Dzulhijjah 1447 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 Juni 2026&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Islamic_New_Year&quot;&gt;Tahun Baru Islam&lt;/a&gt; (1 Muharram)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 Muharram 1448 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 Agustus 2026&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Mawlid&quot;&gt;Maulid Nabi&lt;/a&gt; Muhammad ﷺ&lt;/td&gt;
&lt;td&gt;12 Rabiul Awal 1448 H&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;kalender-lengkap&quot;&gt;Kalender Lengkap&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Berikut kalender lengkap yang bisa kamu lihat langsung. Klik tombol download untuk menyimpan versi PDF-nya.&lt;/p&gt;
&lt;iframe src=&quot;/assets/kemenag-2026.pdf&quot; loading=&quot;lazy&quot; title=&quot;Kalender Kemenag 2026&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;https://mabims.dev/assets/kemenag-2026.pdf&quot; download&gt;Download PDF&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;pemetaan-bulan-hijriah--masehi-2026&quot;&gt;Pemetaan Bulan Hijriah – Masehi 2026&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bulan Masehi&lt;/th&gt;
&lt;th&gt;Bulan Hijriah&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Januari&lt;/td&gt;
&lt;td&gt;Rajab – Sya’ban&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Februari&lt;/td&gt;
&lt;td&gt;Sya’ban – Ramadhan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maret&lt;/td&gt;
&lt;td&gt;Ramadhan – Syawal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;April&lt;/td&gt;
&lt;td&gt;Syawal – Dzulqa’dah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mei&lt;/td&gt;
&lt;td&gt;Dzulqa’dah – Dzulhijjah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Juni&lt;/td&gt;
&lt;td&gt;Dzulhijjah – Muharram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Juli&lt;/td&gt;
&lt;td&gt;Muharram – Safar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agustus&lt;/td&gt;
&lt;td&gt;Safar – Rabiul Awal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;September&lt;/td&gt;
&lt;td&gt;Rabiul Awal – Rabiul Akhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oktober&lt;/td&gt;
&lt;td&gt;Rabiul Akhir – Jumadil Awal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;November&lt;/td&gt;
&lt;td&gt;Jumadil Awal – Jumadil Akhir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desember&lt;/td&gt;
&lt;td&gt;Jumadil Akhir – Rajab&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;hari-libur-nasional--cuti-bersama-2026&quot;&gt;Hari Libur Nasional &amp;#x26; Cuti Bersama 2026&lt;/h2&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tanggal&lt;/th&gt;
&lt;th&gt;Keterangan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 Januari&lt;/td&gt;
&lt;td&gt;Tahun Baru 2026 Masehi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 Januari&lt;/td&gt;
&lt;td&gt;Isra Mikraj Nabi Muhammad ﷺ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 Februari&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Chinese_New_Year&quot;&gt;Tahun Baru Imlek&lt;/a&gt; 2577 Kongzili&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19 Maret&lt;/td&gt;
&lt;td&gt;Hari Suci &lt;a href=&quot;https://en.wikipedia.org/wiki/Nyepi&quot;&gt;Nyepi&lt;/a&gt; (Tahun Baru Saka 1948)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21–22 Maret&lt;/td&gt;
&lt;td&gt;Idul Fitri 1447 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 April&lt;/td&gt;
&lt;td&gt;Wafat Yesus Kristus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 April&lt;/td&gt;
&lt;td&gt;Kebangkitan Yesus Kristus (Paskah)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 Mei&lt;/td&gt;
&lt;td&gt;Hari Buruh Internasional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 Mei&lt;/td&gt;
&lt;td&gt;Kenaikan Yesus Kristus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27 Mei&lt;/td&gt;
&lt;td&gt;Idul Adha 1447 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31 Mei&lt;/td&gt;
&lt;td&gt;Hari Raya &lt;a href=&quot;https://en.wikipedia.org/wiki/Vesak&quot;&gt;Waisak&lt;/a&gt; 2570 BE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 Juni&lt;/td&gt;
&lt;td&gt;Hari Lahir &lt;a href=&quot;https://en.wikipedia.org/wiki/Pancasila_(politics)&quot;&gt;Pancasila&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16 Juni&lt;/td&gt;
&lt;td&gt;Tahun Baru Islam 1448 H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17 Agustus&lt;/td&gt;
&lt;td&gt;Proklamasi Kemerdekaan RI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 Agustus&lt;/td&gt;
&lt;td&gt;Maulid Nabi Muhammad ﷺ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25 Desember&lt;/td&gt;
&lt;td&gt;Kelahiran Yesus Kristus (Natal)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Cuti bersama:&lt;/strong&gt; 16, 20, 23, 24 Maret (Idul Fitri) · 18 Maret (Nyepi) · 15 Mei (Kenaikan) · 28–29 Mei (Idul Adha) · 24 Desember (Natal)&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kriteria-mabims&quot;&gt;Kriteria MABIMS&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Penentuan awal bulan Hijriah (1 Ramadhan, 1 Syawal, 1 Dzulhijjah, dll.) didasarkan pada pengamatan hilal (rukyah) yang divalidasi dengan hisab. Negara-negara anggota MABIMS (Brunei Darussalam, Indonesia, Malaysia, dan Singapura) telah menyepakati kriteria visibilitas hilal sebagai berikut. Penjelasan lengkap soal asal-usul dan sejarahnya ada di &lt;a href=&quot;https://mabims.dev/apa-itu-mabims/&quot;&gt;Apa itu MABIMS?&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kriteria&lt;/th&gt;
&lt;th&gt;Ambang Batas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ketinggian hilal (altitude)&lt;/td&gt;
&lt;td&gt;≥ 3°&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elongasi bulan-matahari&lt;/td&gt;
&lt;td&gt;≥ 6,4°&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Kedua syarat harus terpenuhi secara bersamaan. Kriteria ini diadopsi sejak 2022, menggantikan kriteria lama “2-3-8” (tinggi ≥ 2°, elongasi ≥ 3°, umur bulan ≥ 8 jam) yang digunakan sejak 1992. Perubahan ini didasarkan pada kompilasi data rukyat global yang menunjukkan bahwa pada posisi hilal rendah dengan elongasi kecil, sabit bulan masih sangat tipis dan sulit diamati secara kasat mata.&lt;/p&gt;
&lt;p&gt;Kriteria baru ini merupakan hasil Muzakarah Rukyah dan Takwim Islam MABIMS 2016 di Malaysia, diperkuat oleh Seminar Internasional Fikih Falak di Jakarta (Rekomendasi Jakarta 2017), dan ditandatangani melalui surat bersama ad referendum pada 2021. Pengumuman resmi pemerintah tentang penerapan kriteria ini bisa dilihat di &lt;a href=&quot;https://setkab.go.id/pemerintah-tetapkan-1-ramadan-1445h-jatuh-pada-selasa-12-maret-2024&quot;&gt;Setkab&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;cek-tanggal-hijriah-untuk-tanggal-apa-saja&quot;&gt;Cek Tanggal Hijriah untuk Tanggal Apa Saja&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Mau tahu tanggal 15 Maret 2026 itu tanggal berapa Hijriah? Atau kapan 1 Ramadhan 1448 H dalam kalender Masehi? Cek langsung di &lt;a href=&quot;https://mabims.dev/kalender-hijriah/&quot;&gt;kalender Hijriah berbasis kriteria MABIMS&lt;/a&gt; kami, atau gunakan API MABIMS.dev (unofficial):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/convert?date=2026-03-15&amp;#x26;calendar=gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-03-15&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;tz&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1447-06-14&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Sya&apos;ban&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1447&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Ahad&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Data berasal dari kalender resmi Kemenag RI yang tersedia publik.&lt;/p&gt;
&lt;p&gt;Dokumentasi lengkap: &lt;a href=&quot;https://mabims.dev/quickstart&quot;&gt;mabims.dev/quickstart&lt;/a&gt;&lt;/p&gt;

</content:encoded><category>Kalender</category><category>Kemenag</category><category>Hijriah</category><category>Libur</category></item><item><title>Cara Menampilkan Tanggal Hijriah Kriteria MABIMS</title><link>https://mabims.dev/blog/cara-tampilkan-tanggal-hijriah/</link><guid isPermaLink="true">https://mabims.dev/blog/cara-tampilkan-tanggal-hijriah/</guid><description>Mau nampilin tanggal Hijriah hari ini di website? Misalnya di header, footer, atau widget masjid/pesantren? Ini cara paling gampang: pakai API gratis mabims.dev, tanpa API key, dan datanya sesuai kriteria MABIMS/Kemenag (bukan Umm al-Qura yang sering beda 1 hari).</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mau nampilin tanggal Hijriah hari ini di website? Misalnya di header, footer, atau widget masjid/pesantren? Ini cara paling gampang, pakai API gratis &lt;a href=&quot;https://mabims.dev&quot;&gt;mabims.dev&lt;/a&gt;, tanpa API key, dan datanya sesuai kriteria &lt;a href=&quot;https://mui.or.id/baca/berita/mengenal-kriteria-hilal-mabims-standard-penentuan-awal-bulan-hijriyah-pemerintah-indonesia&quot;&gt;MABIMS/Kemenag&lt;/a&gt; (bukan &lt;a href=&quot;https://en.wikipedia.org/wiki/Umm_al-Qura_calendar&quot;&gt;Umm al-Qura&lt;/a&gt; yang sering beda 1 hari).&lt;/p&gt;
&lt;p&gt;Cukup panggil endpoint ini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Responsnya JSON kayak gini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-08-24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;tz&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1448-03-11&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rabiul Akhir&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1448&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Senin&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Yang kamu butuhin cuma bagian &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt;, udah ada &lt;code dir=&quot;auto&quot;&gt;day&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;month_name&lt;/code&gt;, dan &lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt; terpisah, jadi nggak perlu parsing string tanggal sendiri.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;opsi-1-javascript-vanilla-tanpa-framework&quot;&gt;Opsi 1: JavaScript (Vanilla, Tanpa Framework)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Paling universal. Tinggal taruh di HTML manapun.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tanggal-hijriah&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;span&gt;Memuat...&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal-hijriah&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal-hijriah&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Selesai. Elemen &lt;code dir=&quot;auto&quot;&gt;&amp;#x3C;span&gt;&lt;/code&gt; itu bakal otomatis keisi tanggal Hijriah hari ini, misalnya &lt;code dir=&quot;auto&quot;&gt;1448-03-14 H&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kalau mau format lebih rapi (nama bulan, bukan angka), kamu &lt;strong&gt;nggak perlu mapping manual&lt;/strong&gt; karena response-nya udah nyediain &lt;code dir=&quot;auto&quot;&gt;day&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;month_name&lt;/code&gt;, dan &lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt; langsung, jadi tinggal dipakai:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const { &lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt; } = &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal-hijriah&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal-hijriah&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Hasilnya jadi: &lt;code dir=&quot;auto&quot;&gt;14 Rabiul Awal 1448 H&lt;/code&gt;. Gak perlu parsing string atau bikin array nama bulan sendiri. Ini beda dari kebanyakan API kalender Hijriah lain yang biasanya cuma ngasih tanggal mentah dan bikin kamu harus mapping nama bulan sendiri.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;opsi-2-php&quot;&gt;Opsi 2: PHP&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Buat website berbasis PHP (custom, atau CMS lawas), pakai &lt;code dir=&quot;auto&quot;&gt;file_get_contents&lt;/code&gt; atau &lt;code dir=&quot;auto&quot;&gt;curl&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file_get_contents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_decode&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$tanggalHijriah&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;?&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;?=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;htmlspecialchars&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;tanggalHijriah&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;?&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;H&lt;/span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Mau format nama bulan (bukan angka)? Response-nya udah nyediain &lt;code dir=&quot;auto&quot;&gt;day&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;month_name&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt; langsung, jadi nggak perlu mapping manual:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$output&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$tanggalHijriah&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;$output&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;} {&lt;/span&gt;&lt;span&gt;$output&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;} {&lt;/span&gt;&lt;span&gt;$output&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;} H&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;?&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&amp;#x3C;?=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;htmlspecialchars&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;tanggalHijriah&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;?&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kalau server kamu matiin &lt;code dir=&quot;auto&quot;&gt;allow_url_fopen&lt;/code&gt;, pakai cURL sebagai gantinya:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$ch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl_init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; CURLOPT_TIMEOUT&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl_exec&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl_close&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_decode&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$tanggalHijriah&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;?&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Tips:&lt;/strong&gt; karena ini request server-side yang blocking, sebaiknya di-cache (misal pakai file cache 1 jam) supaya nggak manggil API setiap kali halaman di-load oleh visitor.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&amp;#x3C;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$cacheFile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;__DIR__&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/hijriah-cache.json&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$cacheTime&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3600&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;// 1 jam&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;file_exists&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;cacheFile&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filemtime&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;cacheFile&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$cacheTime&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file_get_contents&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;cacheFile&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file_get_contents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_decode&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;file_put_contents&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;cacheFile&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;$tanggalHijriah&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;opsi-3-wordpress-shortcode&quot;&gt;Opsi 3: WordPress (Shortcode)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau website kamu WordPress, tinggal tambahkan ini ke &lt;code dir=&quot;auto&quot;&gt;functions.php&lt;/code&gt; tema (atau plugin custom):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tampilkan_tanggal_hijriah&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_transient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal_hijriah_hari_ini&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;$cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$cache&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$response&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wp_remote_get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;is_wp_error&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$body&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;wp_remote_retrieve_body&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$tanggal&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$body&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;$hasil&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;esc_html&lt;/span&gt;&lt;span&gt;($&lt;/span&gt;&lt;span&gt;tanggal&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;set_transient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal_hijriah_hari_ini&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;hasil&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; HOUR_IN_SECONDS&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$hasil&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;add_shortcode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tanggal_hijriah&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tampilkan_tanggal_hijriah&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Lalu pakai shortcode &lt;code dir=&quot;auto&quot;&gt;[tanggal_hijriah]&lt;/code&gt; di halaman, widget teks, atau editor blok manapun. WordPress otomatis handle request-nya lewat &lt;code dir=&quot;auto&quot;&gt;wp_remote_get&lt;/code&gt; (lebih aman daripada &lt;code dir=&quot;auto&quot;&gt;file_get_contents&lt;/code&gt; langsung), dan &lt;code dir=&quot;auto&quot;&gt;set_transient&lt;/code&gt; bikin hasilnya ke-cache 1 jam biar nggak manggil API tiap page load.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bonus-nampilin-kalender-sebulan-penuh-bukan-cuma-hari-ini&quot;&gt;Bonus: Nampilin Kalender Sebulan Penuh (Bukan Cuma Hari Ini)&lt;/h2&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Script nggak pengin nulis kode? Lihat langsung &lt;a href=&quot;https://mabims.dev/kalender-hijriah/&quot;&gt;kalender Hijriah MABIMS online&lt;/a&gt; di mabims.dev.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kalau kamu bukan cuma butuh tanggal hari ini, tapi mau bikin &lt;strong&gt;grid kalender bulanan&lt;/strong&gt; (misalnya widget kalender Hijriah lengkap 29-30 hari), pakai endpoint &lt;code dir=&quot;auto&quot;&gt;/month&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/month?year={Y}&amp;#x26;month={M}&amp;#x26;calendar=hijri&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Contoh, ambil bulan Ramadhan 1447 H:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/month?year=1447&amp;#x26;month=9&amp;#x26;calendar=hijri&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Setiap item dalam responsnya berisi pasangan tanggal Gregorian-Hijriah, jadi tinggal di-loop buat bikin grid:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/month?year=1447&amp;#x26;month=9&amp;#x26;calendar=hijri&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;res&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;listEl&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;kalender-bulan&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;forEach&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;createElement&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;listEl&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;appendChild&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parameter penting:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt; &amp;#x26; &lt;code dir=&quot;auto&quot;&gt;month&lt;/code&gt; — wajib. &lt;code dir=&quot;auto&quot;&gt;month&lt;/code&gt; itu 1–12.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;calendar&lt;/code&gt; — default &lt;code dir=&quot;auto&quot;&gt;hijri&lt;/code&gt;. Set &lt;code dir=&quot;auto&quot;&gt;gregorian&lt;/code&gt; kalau &lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt;/&lt;code dir=&quot;auto&quot;&gt;month&lt;/code&gt; yang kamu kasih itu tahun/bulan Masehi, bukan Hijriah.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bulan Hijriah yang di luar cakupan tabel resmi (misalnya jauh ke tahun-tahun mendatang) tetap dilayani otomatis lewat perhitungan Neo MABIMS, selama masih dalam rentang yang didukung, jadi gak perlu penanganan khusus di sisi kamu deh.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;butuh-satu-tahun-penuh-sekaligus&quot;&gt;Butuh Satu Tahun Penuh Sekaligus?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Daripada manggil &lt;code dir=&quot;auto&quot;&gt;/month&lt;/code&gt; 12 kali buat bikin kalender tahunan, ada endpoint &lt;code dir=&quot;auto&quot;&gt;/year&lt;/code&gt; yang langsung ngasih semua bulan sekaligus:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/year?year=1447&amp;#x26;calendar=hijri&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Respons-nya dikelompokkan per bulan (key &lt;code dir=&quot;auto&quot;&gt;&quot;1&quot;&lt;/code&gt; sampai &lt;code dir=&quot;auto&quot;&gt;&quot;12&quot;&lt;/code&gt;), masing-masing berisi array hari dengan format sama seperti &lt;code dir=&quot;auto&quot;&gt;/month&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1447&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;count&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;354&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;months&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;span&gt;&quot;gregorian&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2025-06-27&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;hijri&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1447-01-01&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Jumat&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;2&quot;&lt;/span&gt;&lt;span&gt;: [ &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Cocok kalau kamu mau bikin halaman kalender tahunan sekali fetch, tanpa harus request berkali-kali per bulan.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;bahasaframework-lain&quot;&gt;Bahasa/Framework Lain?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Prinsipnya sama di semua bahasa: Cukup HTTP GET ke &lt;code dir=&quot;auto&quot;&gt;https://api.mabims.dev/api/v1/today&lt;/code&gt;, parse JSON, ambil &lt;code dir=&quot;auto&quot;&gt;output.date&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dokumentasi lengkap endpoint lain (konversi tanggal, kalender bulanan, hari besar Islam) ada di &lt;a href=&quot;https://mabims.dev/quickstart&quot;&gt;mabims.dev/quickstart&lt;/a&gt;.&lt;/p&gt;

</content:encoded><category>Tutorial</category><category>Hijriah</category><category>MABIMS</category><category>JavaScript</category><category>PHP</category><category>WordPress</category></item><item><title>Di Mana Cari Hilal?</title><link>https://mabims.dev/blog/behind-hilal-viz/</link><guid isPermaLink="true">https://mabims.dev/blog/behind-hilal-viz/</guid><description>Salah satu endpoint yang paling saya suka di mabims.dev bukan /today atau /convert, tapi /hilal/viz. Endpoint ini generate PNG 720×1280 yang nampilin visualisasi langit senja lengkap dengan posisi bulan, status kelolosan kriteria MABIMS, sampai grafik langit dengan bintang-bintang segala. Deep dive ke behind the scenenya</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Salah satu endpoint yang paling saya suka di mabims.dev bukan &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; atau &lt;code dir=&quot;auto&quot;&gt;/convert&lt;/code&gt;, tapi &lt;code dir=&quot;auto&quot;&gt;/hilal/viz&lt;/code&gt;. Endpoint ini generate PNG 720×1280 yang nampilin visualisasi langit senja lengkap dengan posisi bulan, status kelolosan kriteria MABIMS, sampai grafik langit dengan bintang-bintang segala.&lt;/p&gt;
&lt;p&gt;Nggak ada API kalender Hijriah lain (setidaknya yang saya temukan) yang punya fitur ini. Jadi tulisan ini bahas gimana cara kerjanya, dari &lt;a href=&quot;https://en.wikipedia.org/wiki/Astronomy&quot;&gt;astronomi&lt;/a&gt; sampai render pixel.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;di-mana-cari-hilal&quot;&gt;Di Mana Cari &lt;a href=&quot;https://en.wikipedia.org/wiki/Hilal&quot;&gt;Hilal&lt;/a&gt;?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Nah ini pertanyaan yang sering muncul: &lt;strong&gt;Di mana kita mengevaluasi kriteria hilal Neo MABMIS?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kriteria &lt;a href=&quot;https://mui.or.id/baca/berita/mengenal-kriteria-hilal-mabims-standard-penentuan-awal-bulan-hijriyah-pemerintah-indonesia&quot;&gt;Neo MABIMS&lt;/a&gt; (ketinggian hilal ≥ 3°, elongasi ≥ 6,4°) itu namanya juga kriteria rukyah, ia harus dievaluasi &lt;strong&gt;dari suatu titik di permukaan bumi&lt;/strong&gt;. Dan Indonesia itu luas. Jadi harusnya gak cuma milih satu titik; API ngecek &lt;strong&gt;25 titik pengamatan pesisir&lt;/strong&gt; dari Sabang sampai Rote, dan kriteria dianggap terpenuhi kalau lolos &lt;strong&gt;di satu titik manapun&lt;/strong&gt;, sama seperti logika rukyah Kemenag: hilal terlihat di wilayah Indonesia, bulan baru dimulai. (Lihat juga &lt;a href=&quot;https://journal.uinsuna.ac.id/index.php/ASTROISLAMICA/article/view/2735&quot;&gt;Jurnal Astroislamica&lt;/a&gt; tentang perspektif Maqāṣid al-Syarī’ah terhadap kriteria ini.)&lt;/p&gt;
&lt;p&gt;Pola menariknya: untuk bulan-bulan yang “aman”, hampir selalu titik paling barat yang memutuskan. Semakin barat, matahari terbenam semakin mundur, jadi hilalnya semakin tinggi di atas horizon saat senja. Sabang dan pesisir barat Aceh jadi &lt;em&gt;last chance&lt;/em&gt; sekaligus &lt;em&gt;first win&lt;/em&gt;. Tapi ada bulan-bulan dengan deklinasi bulan selatan di mana arc selatan (selatan Jawa sampai Nusa Tenggara) yang menang. Data historis 1970–2050 menunjukkan titik-titik Jawa (Ujung Kulon, Pangandaran) ikut memutuskan beberapa bulan. Makanya titik-titik selatan itu ada di daftar, bukan pajangan.&lt;/p&gt;
&lt;p&gt;Bila kriteria terpenuhi, API melaporkan titik yang memutuskan lewat field &lt;code dir=&quot;auto&quot;&gt;deciding_site&lt;/code&gt; di &lt;code dir=&quot;auto&quot;&gt;/hilal/info&lt;/code&gt;, dan grafiknya menampilkan baris &lt;strong&gt;TITIK PENGAMAT&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;alur-kerjanya&quot;&gt;Alur Kerjanya&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Simplifikasi dari implementasi aslinya kira-kira begini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FUNCTION hilal_viz(month, year):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sighting = resolve_sighting_evening(year, month)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ms = sighting_on_date(sighting.evening_date)     # 25 titik, satu panggilan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chosen = ms.deciding_site or ms.best_site        # titik penentu (atau terdekat)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alt_ok = chosen.alt_refracted &gt;= 3.0°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;elong_ok = chosen.elongation &gt;= 6.4°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data = build_chart_data(..., decider=chosen)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;img = render_chart(data)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return PNG&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;1-resolve-malam-pengamatan&quot;&gt;1. Resolve malam pengamatan&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Kalau kamu minta visibilitas untuk bulan Ramadhan, endpoint ini nggak menghitung tanggal 1 Ramadhan itu sendiri, tapi mundur ke &lt;strong&gt;malam ke-29 Sya’ban&lt;/strong&gt;, karena itu malam yang sebenarnya diamati untuk menentukan apakah besok sudah masuk Ramadhan atau belum. Ini logika dasar rukyah: kamu mengamati hilal di ujung bulan berjalan, bukan di awal bulan target.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;2-hitung-astronomi-malam-itu-di-titik-penentu&quot;&gt;2. Hitung astronomi malam itu, di titik penentu&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Dua kategori data dihitung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kriteria&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;moon_alt&lt;/code&gt; (ketinggian bulan &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Horizontal_coordinate_system&quot;&gt;toposentris&lt;/a&gt;&lt;/em&gt;, terkoreksi refraksi), &lt;code dir=&quot;auto&quot;&gt;moon_az&lt;/code&gt; (azimut), &lt;code dir=&quot;auto&quot;&gt;sun_alt&lt;/code&gt;, dan &lt;code dir=&quot;auto&quot;&gt;elongation&lt;/code&gt; (jarak sudut bulan-matahari, &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Barycentric_coordinates_(astronomy)&quot;&gt;geosentris&lt;/a&gt;&lt;/em&gt; sesuai konvensi hisab Indonesia). Ini angka-angka yang langsung dibandingkan ke ambang batas MABIMS — semuanya milik &lt;strong&gt;satu titik yang sama&lt;/strong&gt;, jadi adegan langit, tabel kriteria, dan verdict nggak bisa saling kontradiksi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waktu pengamat (observer-clock)&lt;/strong&gt; — iluminasi, jam matahari terbenam, dan jam bulan terbenam, semuanya di titik penentu dan ditampilkan dalam zona waktu lokal titik itu (WIB atau WITA).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;3-cek-ambang-batas-neo-mabims&quot;&gt;3. Cek ambang batas Neo MABIMS&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alt_ok   = moon_alt_refracted &gt;= 3.0°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;elong_ok = elongation         &gt;= 6.4°&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dua syarat ini harus terpenuhi bersamaan, minimal di satu titik. Kalau di titik manapun nggak ada yang lolos, hilal dianggap belum memenuhi kriteria visibilitas, meskipun bulan sudah di atas horizon di beberapa titik.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;contoh-hasil&quot;&gt;Contoh Hasil&lt;/h2&gt;&lt;/div&gt;
&lt;img src=&quot;https://mabims.dev/viz.png&quot; alt=&quot;Visualisasi hilal dari endpoint /hilal/viz&quot;&gt;
&lt;p&gt;Screenshot di atas itu visibilitas untuk 1 Dzulqa’dah 1447 H (evaluasi malam 29 Syawal 1447 H, 18 Apr 2026, titik pengamatan Sabang):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Altitude bulan +10.4° (lolos, syarat ≥3.0°)&lt;/li&gt;
&lt;li&gt;Elongasi 14.5° (lolos, syarat ≥6.4°)&lt;/li&gt;
&lt;li&gt;Iluminasi 1.4% — sabit masih ramping tapi udah jelas&lt;/li&gt;
&lt;li&gt;Matahari terbenam 18:46, bulan terbenam 19:31 — selisih 45 menit, jendela pengamatan nyaman&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Status: &lt;strong&gt;MEMENUHI KRITERIA&lt;/strong&gt;, dan kali ini marginnya jauh di atas ambang. Bandingin sama bulan-bulan borderline (misal 1446-08 yang lolos dengan margin 0,006°) — di grafiknya sabitnya nyaris nggak kelihatan, dan verdict-nya “MENDEKATI BATAS”. Grafik ini nggak bohong.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kenapa-repot-repot-bikin-ini&quot;&gt;Kenapa Repot-repot Bikin Ini?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Karena angka mentah (&lt;code dir=&quot;auto&quot;&gt;moon_alt: 10.4, elongation: 14.5&lt;/code&gt;) nggak intuitif buat kebanyakan orang, termasuk saya sendiri. Tapi begitu divisualisasikan -&gt; lihat posisi bulan relatif ke horizon, lihat pill hijau/merah, lihat tabel kriteria -&gt; jadi jauh lebih gampang dicerna. Endpoint ini niatnya bukan cuma buat developer yang butuh JSON, tapi juga buat siapa saja yang penasaran “kok bisa sih hilal dibilang terlihat/tidak terlihat” tanpa harus paham astronomi.&lt;/p&gt;
&lt;p&gt;Coba sendiri di &lt;a href=&quot;https://mabims.dev/demo/hilal&quot;&gt;demo&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/hilal/viz?month=1&amp;#x26;year=1448&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ganti &lt;code dir=&quot;auto&quot;&gt;month&lt;/code&gt; dan &lt;code dir=&quot;auto&quot;&gt;year&lt;/code&gt; sesuai bulan Hijriah yang mau dicek. Dokumentasi lengkap parameter ada di &lt;a href=&quot;https://mabims.dev/endpoints/hilal&quot;&gt;mabims.dev/endpoints/hilal&lt;/a&gt;.&lt;/p&gt;

</content:encoded><category>Astronomi</category><category>Hilal</category><category>Visualisasi</category><category>MABIMS</category></item><item><title>Tutorial Integrasi MABIMS API</title><link>https://mabims.dev/blog/cara-pakai-mabims-api/</link><guid isPermaLink="true">https://mabims.dev/blog/cara-pakai-mabims-api/</guid><description>API ini saya bikin buat developer, dan saya nggak mau integrasinya berhenti di dokumentasi yang isinya cuma GET /today lalu selesai. Jadi di tulisan ini saya mau kasih contoh dari yang paling sederhana sampai yang agak proper: JavaScript biasa, Vue, React, sampai aplikasi mobile.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;API ini saya bikin buat developer, dan saya nggak mau integrasinya berhenti di dokumentasi yang isinya cuma &lt;code dir=&quot;auto&quot;&gt;GET /today&lt;/code&gt; lalu selesai. Jadi di tulisan ini saya mau kasih contoh dari yang paling sederhana sampai yang agak proper: JavaScript biasa, Vue, React, sampai aplikasi mobile.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;paling-sederhana-javascript&quot;&gt;Paling sederhana: JavaScript&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau website kamu cuma butuh menampilkan tanggal Hijriah hari ini, sebenarnya sesimpel ini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Response-nya kira-kira begini:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;input&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-08-28&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;gregorian&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;tz&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;output&quot;&lt;/span&gt;&lt;span&gt;: { &lt;/span&gt;&lt;span&gt;&quot;date&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1448-03-15&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;calendar&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;day&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;month_name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Rabiul Akhir&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;year&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;1448&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;weekday&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Jumat&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;source&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span&gt;: []&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kamu tinggal ambil field &lt;code dir=&quot;auto&quot;&gt;output&lt;/code&gt; untuk ditampilkan. Sudah lengkap, tidak perlu parse sendiri:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const { &lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt; } = &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;#hijri-date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;textContent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;day&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;month_name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Jadi misalnya di header website kamu ada:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijri-date&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;tinggal panggil fungsi tadi dan tanggal Hijriahnya akan muncul.&lt;/p&gt;
&lt;p&gt;Nggak perlu install library. Nggak perlu API key. Nggak perlu bikin server sendiri cuma untuk mengambil tanggal Hijriah.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kalau-pakai-timezone&quot;&gt;Kalau pakai timezone&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ini bagian yang menurut saya penting.&lt;/p&gt;
&lt;p&gt;Tanggal Hijriah bukan cuma soal konversi tanggal Masehi → Hijriah. &lt;strong&gt;Timezone juga menentukan “hari ini” itu hari apa.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Misalnya server kamu berada di Amerika, tapi user kamu kebanyakan di Indonesia. Jangan sampai jam 00:30 WIB dianggap masih tanggal sebelumnya karena server kamu masih berada di hari sebelumnya.&lt;/p&gt;
&lt;p&gt;mabims.dev menyediakan timezone override supaya kamu bisa menentukan timezone yang ingin digunakan. Pakai parameter &lt;code dir=&quot;auto&quot;&gt;tz&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Untuk aplikasi yang memang targetnya Indonesia, saya biasanya akan eksplisit menggunakan &lt;code dir=&quot;auto&quot;&gt;Asia/Jakarta&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;Asia/Makassar&lt;/code&gt;, atau &lt;code dir=&quot;auto&quot;&gt;Asia/Jayapura&lt;/code&gt; sesuai kebutuhan.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;di-vue&quot;&gt;Di &lt;a href=&quot;https://vuejs.org/guide/introduction.html&quot;&gt;Vue&lt;/a&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau kamu pakai Vue, konsepnya sama. Bedanya cuma kita simpan hasil API ke state.&lt;/p&gt;
&lt;p&gt;Misalnya dengan Composition API:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setup&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { ref, onMounted } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;vue&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;ref&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;onMounted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;v-if&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{{ hijriDate.output.date }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;v-else&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Memuat tanggal Hijriah...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Selesai.&lt;/p&gt;
&lt;p&gt;Saya justru menyarankan pendekatan seperti ini daripada memasukkan library kalender Hijriah yang ukurannya jauh lebih besar kalau kebutuhan aplikasi kamu cuma &lt;strong&gt;menampilkan tanggal Hijriah&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;di-react&quot;&gt;Di &lt;a href=&quot;https://react.dev/learn&quot;&gt;React&lt;/a&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Di React juga kurang lebih sama:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { useEffect, useState } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;react&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HijriDate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const [&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;useState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;useEffect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; []);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Memuat tanggal Hijriah...&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;#x3C;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Tidak ada dependency tambahan.&lt;/p&gt;
&lt;p&gt;React tinggal fetch API → simpan hasilnya → render.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kalau-butuh-tanggal-tertentu&quot;&gt;Kalau butuh tanggal tertentu&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt; cocok kalau yang kamu butuhkan adalah tanggal Hijriah hari ini.&lt;/p&gt;
&lt;p&gt;Tapi bagaimana kalau user memilih tanggal dari date picker?&lt;/p&gt;
&lt;p&gt;Misalnya user memilih:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;17 Agustus 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kamu bisa menggunakan endpoint konversi:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/convert?date=2026-08-17&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Ini berguna untuk kalender, form, artikel yang punya tanggal publikasi, atau fitur pencarian tanggal.&lt;/p&gt;
&lt;p&gt;Misalnya user memilih tanggal 17 Agustus 2026 dan kamu ingin menampilkan versi Hijriahnya. Tinggal kirim tanggal Gregorian tersebut ke API.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;jangan-lupa-cek-source&quot;&gt;Jangan lupa cek &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ada satu hal yang menurut saya cukup penting ketika mengonsumsi API ini.&lt;/p&gt;
&lt;p&gt;Response mabims.dev punya informasi &lt;code dir=&quot;auto&quot;&gt;source&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Secara sederhana, ada dua kemungkinan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;mabims&lt;/code&gt; — tanggal berasal dari tabel resmi Kemenag yang tersedia.&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;mabims-computed&lt;/code&gt; — tanggal dihitung menggunakan kriteria Neo MABIMS sebagai fallback ketika tanggal tersebut berada di luar cakupan tabel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kenapa saya expose informasi ini?&lt;/p&gt;
&lt;p&gt;Karena saya nggak mau API diam-diam memberikan hasil perhitungan lalu developer mengira itu adalah tanggal resmi dari Kemenag.&lt;/p&gt;
&lt;p&gt;Kalau aplikasi kamu cukup serius soal kalender, kamu bisa menyimpan atau menampilkan informasi tersebut.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mabims-computed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Tanggal menggunakan hasil perhitungan Neo MABIMS&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dan kalau API mengembalikan &lt;code dir=&quot;auto&quot;&gt;warnings&lt;/code&gt;, sebaiknya jangan dibuang begitu saja.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;warnings&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;kalau-aplikasinya-mobile&quot;&gt;Kalau aplikasinya mobile&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Kalau kamu bikin aplikasi Android/iOS, prinsipnya sebenarnya sama.&lt;/p&gt;
&lt;p&gt;Mau Flutter, React Native, Kotlin, Swift, atau framework lainnya, selama aplikasinya bisa melakukan HTTP request, kamu bisa memanggil API ini.&lt;/p&gt;
&lt;p&gt;Misalnya pseudocode-nya:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;GET https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;JSON response&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Simpan ke state&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Tampilkan:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;1448-03-15&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;API-nya tidak peduli apakah request datang dari browser, server, atau aplikasi mobile.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;tapi-apakah-setiap-halaman-harus-request-ke-api&quot;&gt;Tapi apakah setiap halaman harus request ke API?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Nah, ini yang mulai masuk ke urusan arsitektur.&lt;/p&gt;
&lt;p&gt;Kalau website kamu punya 100 komponen yang semuanya membutuhkan tanggal Hijriah, &lt;strong&gt;jangan setiap komponen melakukan &lt;code dir=&quot;auto&quot;&gt;fetch(&quot;/today&quot;)&lt;/code&gt; sendiri-sendiri.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lebih baik fetch sekali, kemudian hasilnya dipakai bersama.&lt;/p&gt;
&lt;p&gt;Di frontend kamu bisa bikin composable/hook/service sendiri.&lt;/p&gt;
&lt;p&gt;Misalnya di React:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getHijriToday&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ok&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Gagal mengambil tanggal Hijriah&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kemudian komponen-komponen lain tinggal menggunakan fungsi tersebut.&lt;/p&gt;
&lt;p&gt;Untuk aplikasi yang lebih besar, bahkan bisa kamu cache hasilnya karena tanggal Hijriah tidak berubah setiap beberapa detik.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;kalau-pakai-ssr-atau-backend&quot;&gt;Kalau pakai SSR atau backend?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Ini malah lebih menarik.&lt;/p&gt;
&lt;p&gt;Kalau kamu menggunakan Next.js, Nuxt, Laravel, Rails, Django, atau backend lainnya, kamu juga bisa memanggil mabims.dev dari server kamu.&lt;/p&gt;
&lt;p&gt;Contohnya secara sederhana:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today?tz=Asia/Jakarta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;const &lt;/span&gt;&lt;span&gt;hijriDate&lt;/span&gt;&lt;span&gt; = await &lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;json&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kemudian server kamu yang mengirimkan tanggal tersebut ke browser.&lt;/p&gt;
&lt;p&gt;Keuntungannya, tanggal Hijriah bisa sudah tersedia ketika halaman pertama kali dirender.&lt;/p&gt;
&lt;p&gt;Tapi kalau kamu melakukan ini, tetap pikirkan caching. Tidak ada gunanya server kamu request tanggal yang sama berkali-kali dalam sehari.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;jadi-kapan-sebaiknya-pakai-api-ini&quot;&gt;Jadi kapan sebaiknya pakai API ini?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Menurut saya, kalau kebutuhanmu cuma:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Saya ingin menampilkan tanggal Hijriah di website saya.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jangan bikin sistem kalender sendiri.&lt;/p&gt;
&lt;p&gt;Jangan maintain tabel sendiri.&lt;/p&gt;
&lt;p&gt;Jangan copy-paste tanggal dari kalender PDF ke database.&lt;/p&gt;
&lt;p&gt;Dan jangan berharap library kalender yang default-nya &lt;a href=&quot;https://en.wikipedia.org/wiki/Umm_al-Qura_calendar&quot;&gt;Umm al-Qura&lt;/a&gt; otomatis cocok untuk kebutuhan Indonesia.&lt;/p&gt;
&lt;p&gt;Cukup:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Website / App&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;mabims.dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;↓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Tanggal Hijriah berbasis MABIMS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Kalau butuh tanggal hari ini, pakai &lt;code dir=&quot;auto&quot;&gt;/today&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kalau butuh konversi tanggal tertentu, pakai &lt;code dir=&quot;auto&quot;&gt;/convert&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kalau aplikasinya butuh timezone tertentu, tentukan timezone-nya secara eksplisit.&lt;/p&gt;
&lt;p&gt;Dan kalau aplikasimu penting secara administratif atau keagamaan, &lt;strong&gt;tetap perlakukan API sebagai sumber data teknis, bukan pengganti keputusan resmi Kemenag.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sekian. Semoga bermanfaat!&lt;/p&gt;

</content:encoded><category>Tutorial</category><category>JavaScript</category><category>Integrasi</category><category>Hijriah</category></item><item><title>Cerita di Balik MABIMS API</title><link>https://mabims.dev/blog/kenapa-saya-bikin-mabims-dev/</link><guid isPermaLink="true">https://mabims.dev/blog/kenapa-saya-bikin-mabims-dev/</guid><description>Dulu, website Kemenag pernah menampilkan tanggal Hijriah di halamannya. Banyak orang termasuk saya sendiri terbiasa mengandalkannya. Tinggal buka website, lihat pojok atas, jadi tahu deh sekarang tanggal berapa Hijriah. Sampai suatu hari, ada postingan viral....</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ada cerita lucu (dan sedikit menyedihkan) di balik mabims.dev.&lt;/p&gt;
&lt;p&gt;Dulu, &lt;a href=&quot;https://kemenag.go.id&quot;&gt;website Kemenag&lt;/a&gt; pernah menampilkan tanggal &lt;a href=&quot;https://en.wikipedia.org/wiki/Islamic_calendar&quot;&gt;Hijriah&lt;/a&gt; di halamannya. Banyak orang termasuk saya sendiri terbiasa mengandalkannya. Tinggal buka website, lihat pojok atas, jadi tahu deh sekarang tanggal berapa Hijriah.&lt;/p&gt;
&lt;p&gt;Sampai suatu hari, ada postingan viral. Kalender keluaran Kemenag bilang tanggal 30, tapi website Kemenag bilang udah masuk tanggal 1 bulan berikutnya. Selisih sehari.&lt;/p&gt;
&lt;p&gt;Postingan itu itu nyebar. Rame. Orang-orang mempertanyakan kenapa situs resmi bisa beda sama kalendernya yang dikeluarkan sendiri.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;solusinya-dihapus-aja&quot;&gt;Solusinya? Dihapus aja&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Saat itu saya nggak tahu detail di baliknya, apakah itu bug, salah kalkulasi, atau apa. Yang saya tahu, ujung-ujungnya elegan sekali: &lt;strong&gt;tanggal Hijriah di website itu dihapus&lt;/strong&gt;. Bukan diperbaiki, dihapus. Masalah selesai sih iya… tapi kayak gimana gitu.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;beberapa-tahun-kemudian-saya-jadi-junior-dev&quot;&gt;Beberapa tahun kemudian, saya jadi junior dev&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Waktu saya mulai kerja sebagai developer, saya baru ngerti apa yang mungkin terjadi. Kalau mau nampilin kalender Hijriah di web, cara paling gampang ya tinggal pasang library atau panggil API pihak ketiga. Dan hampir semua library/API kalender Hijriah yang gampang ditemukan itu defaultnya pakai kriteria &lt;a href=&quot;https://en.wikipedia.org/wiki/Umm_al-Qura_calendar&quot;&gt;Umm al-Qura&lt;/a&gt;, kalender resmi Arab Saudi.&lt;/p&gt;
&lt;p&gt;Masuk akal kalau itu yang dipakai. Dokumentasinya lengkap, gampang diintegrasikan, gratis. Tapi Umm al-Qura itu dirancang untuk kebutuhan Arab Saudi, bukan hasil rukyah atau &lt;a href=&quot;https://en.wikipedia.org/wiki/Moon_sighting&quot;&gt;sidang isbat&lt;/a&gt; Kemenag RI. Makanya bisa beda ±1 hari dari yang diumumkan di Indonesia, persis kejadian yang bikin viral itu.&lt;/p&gt;
&lt;p&gt;Jadi kemungkinan besar itu bukan “bug” dalam arti kesalahan kode. Itu bug karena pakai sumber data yang salah untuk konteks Indonesia.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;isi-gap-nya&quot;&gt;Isi gap-nya&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Setelah nyadar itu, saya mikir: kalau developer lain di Indonesia mau bikin aplikasi yang nampilin kalender Hijriah dan pengen datanya sesuai keputusan Kemenag (bukan Saudi), opsinya dikit banget. Kebanyakan harus scraping manual atau maintain tabel sendiri (spoiler: developer =/= ahli astronomi).&lt;/p&gt;
&lt;p&gt;Makanya saya bikin &lt;strong&gt;mabims.dev&lt;/strong&gt;: API kalender Hijriah yang sumbernya dari kalender resmi Kemenag RI, pakai kriteria Neo MABIMS untuk fallback di luar cakupan. Gratis, tanpa API key, tinggal panggil endpoint.&lt;/p&gt;
&lt;p&gt;Realistisnya… saya nggak tahu bakal banyak yang pakai atau nggak. Tapi minimal ada satu aplikasi yang pasti pakai: &lt;a href=&quot;https://kajian.malangmengaji.com&quot;&gt;kajian.malangmengaji.com&lt;/a&gt;, yang saya bangun juga. Kalau nggak ada developer lain yang butuh, ya sudah… API ini akan tetap jalan buat aplikasi saya sendiri.&lt;/p&gt;
&lt;p&gt;Tapi kalau kamu develop aplikasi yang butuh kalender Hijriah yang akurat buat Indonesia, silakan pakai. Gratis, &lt;a href=&quot;https://github.com/PijarAdiluhung/mabims-api&quot;&gt;open source&lt;/a&gt;, dan mudah-mudahan nggak akan pernah perlu dihapus karena ketauan salah tanggal :)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Coba sekarang:&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://api.mabims.dev/api/v1/today&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Dokumentasi lengkap ada di &lt;a href=&quot;https://mabims.dev/quickstart&quot;&gt;mabims.dev/quickstart&lt;/a&gt;. Bukan developer? Coba dulu di browser: &lt;a href=&quot;https://mabims.dev/kalender-hijriah/&quot;&gt;kalender Hijriah MABIMS&lt;/a&gt;.&lt;/p&gt;

</content:encoded><category>Cerita</category><category>MABIMS</category><category>Kemenag</category><category>Hijriah</category></item></channel></rss>