source image https://apprecs.com/android/com.nom.dateconverterfull/date-calendar-converter-full
Berhubung kali ini bulan ramadhan, mungkin sebagian teman-teman ada yang sedang mengerjakan atau tertarik untuk membuat project jam digital yang menampilkan bulan hijriah.
Ok, untuk mempersingkat waktu, langsung saja kita masuk ke pokok pembahasannya. artikel ini terinspirasi dari rumus berikut Konversi-Hijriyah-Masehi-Algoritma-Jean-Meeus-v1 source artikel nya saya lupa lagi, jadi mohon maaf untuk penulis, saya tidak bisa mencantumkan link langsung ke website beliau.
berikut adalah source yang saya buat
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static const char* hijriMonth[] = {"Muharram", "Safar", "Rabi'ul Awwal", "Rabi'ul Akhir", "Jumadal Ula", "Jumadal Akhira", "Rajab", "Sha'ban", "Ramadan", "Shawwal", "Dhul Qa'ada", "Dhul Hijja"}; | |
struct hijri { | |
int year; | |
int month; | |
int date; | |
}; | |
int getMonth(uint8_t m) { | |
if (m < 3) { | |
return m + 12; | |
} | |
return m; | |
} | |
int getYear(uint16_t y, uint8_t m) { | |
if (m < 3) { | |
return y - 1; | |
} | |
return y; | |
} | |
String yearType(uint8_t d, uint8_t m, uint16_t y) { | |
if (y > 1582) { | |
return "GREGORIAN"; | |
} else if (y < 1582) { | |
return "JULIAN"; | |
} else if (m > 10) { | |
return "GREGORIAN"; | |
} else if (m < 10) { | |
return "JULIAN"; | |
} else if (d >= 15) { | |
return "GREGORIAN"; | |
} else if (d <= 4) { | |
return "JULIAN"; | |
} else { | |
return "SALAH"; | |
} | |
} | |
hijri toHijri(uint8_t d, uint8_t m, uint16_t y) { | |
float around = 365.25; | |
uint8_t bulan = getMonth(m); | |
//Serial.print("bulan: "); | |
//Serial.println(bulan); | |
int tahun = getYear(y, m); | |
//Serial.print("tahun: "); | |
//Serial.println(tahun); | |
int alpha = tahun / 100; | |
//Serial.print("alpha: "); | |
//Serial.println(alpha); | |
int beta = 2 - alpha + (alpha / 4); | |
//Serial.print("beta: "); | |
//Serial.println(beta); | |
uint32_t b = uint32_t(around * tahun) + int(30.6001 * (bulan + 1)) + d + 1722519 + beta; | |
//Serial.print("b: "); | |
//Serial.println(b); | |
int c = uint16_t((b - 122.1) / around); | |
//Serial.print("c: "); | |
//Serial.println(c); | |
uint32_t _d = uint32_t(around * c); | |
//Serial.print("_d: "); | |
//Serial.println(_d); | |
int e = int((b - _d) / 30.6001); | |
//Serial.print("e: "); | |
//Serial.println(e); | |
String Cal = yearType(d, bulan, tahun); | |
int D, M, X; | |
if (Cal == "GREGORIAN") { | |
D = (b - _d) - int(30.6001 * e); | |
//Serial.print("D: "); | |
//Serial.println(D); | |
//Serial.println(int(30.6001 * e)); | |
M = (e < 14) ? e - 1 : e - 13; | |
//Serial.print("M: "); | |
//Serial.println(M); | |
X = M < 3 ? c - 4715 : c - 4716; | |
//Serial.print("X: "); | |
//Serial.println(X); | |
} | |
int W = (X / 4 == 0) ? 1 : 2; | |
//Serial.print("W: "); | |
//Serial.println(W); | |
int N = int(275 * M / 9) - W * int((M + 9) / 12) + D - 30; | |
//Serial.print("N: "); | |
//Serial.println(N); | |
int A = X - 623; | |
//Serial.print("A: "); | |
//Serial.println(A); | |
int B = A / 4; | |
//Serial.print("B: "); | |
//Serial.println(B); | |
int C = A % 4; | |
//Serial.print("C: "); | |
//Serial.println(C); | |
float C1 = around * C + 0.01; | |
//Serial.print("C1: "); | |
//Serial.println(C1); | |
int C2 = C1 - int(C1) > 0.5 ? int(C1) + 1 : int(C1); | |
//Serial.print("C2: "); | |
//Serial.println(C2); | |
uint32_t Del = (1461UL * 349) + 170 + C2; | |
//Serial.print("DEL: "); | |
//Serial.println(Del); | |
int Q = int(Del / 10631UL); | |
//Serial.print("Q: "); | |
//Serial.println(Q); | |
int R = Del % 10631UL; | |
//Serial.print("R: "); | |
//Serial.println(R); | |
int J = int(R / 354); | |
//Serial.print("J: "); | |
//Serial.println(J); | |
int K = R % 354; | |
//Serial.print("K: "); | |
//Serial.println(K); | |
int O = int((11 * J + 14) / 30); | |
//Serial.print("O: "); | |
//Serial.println(O); | |
int H = 30 * Q + J + 1; //islamic year | |
//Serial.print("H: "); | |
//Serial.println(H); | |
int JJ = K - O + N - 1; | |
//Serial.print("JJ: "); | |
//Serial.println(JJ); | |
int CL = H % 30; | |
//Serial.print("CL: "); | |
//Serial.println(CL); | |
float DL = (11 * CL + 3) % 30; | |
//Serial.print("DL: "); | |
//Serial.println(DL); | |
int JJ_ = JJ; | |
if (JJ > 354) { | |
JJ_ = DL < 19 ? JJ - 354 : JJ - 355; | |
} | |
//Serial.print("JJ_: "); | |
//Serial.println(JJ_); | |
int JJ__ = JJ_ == 0 ? 355 : JJ_; | |
//Serial.print("JJ__: "); | |
//Serial.println(JJ__); | |
int S = int((JJ__ - 1) / 29.5); | |
//Serial.print("S: "); | |
//Serial.println(S); | |
int isM = JJ__ == 355 ? 12 : (S + 1); //islamic month | |
//Serial.print("islamic Month: "); | |
//Serial.println(isM); | |
int isD = JJ__ == 355 ? 30 : int(JJ__ - 29.5 * S); | |
//Serial.print("islamic Dat: "); | |
//Serial.println(isD); | |
hijri result = {H,isM, isD }; | |
return result; | |
} |
Sekian artikel ini, semoga bisa bermanfaat
Comments
Post a Comment