From bf046568682445d37bbfabaa914e916143e37f07 Mon Sep 17 00:00:00 2001 From: ahmed_dev Date: Wed, 5 Aug 2026 09:58:12 +0000 Subject: [PATCH] =?UTF-8?q?=D8=A5=D8=B6=D8=A7=D9=81=D8=A9=20hijri.py=20-?= =?UTF-8?q?=20=D8=A8=D8=B3=D9=85=20=D8=A7=D9=84=D9=84=D9=87=20=D8=A7=D9=84?= =?UTF-8?q?=D8=B1=D8=AD=D9=85=D9=86=20=D8=A7=D9=84=D8=B1=D8=AD=D9=8A=D9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hijri.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 hijri.py diff --git a/hijri.py b/hijri.py new file mode 100644 index 0000000..a0a803f --- /dev/null +++ b/hijri.py @@ -0,0 +1,55 @@ +"""Hijri Calendar Library - مكتبة التقويم الهجري""" +from datetime import date, timedelta + +# أم القرى - أشهر التقويم الهجري +HIJRI_MONTHS = [ + "محرم", "صفر", "ربيع الأول", "ربيع الثاني", + "جمادى الأولى", "جمادى الآخرة", "رجب", + "شعبان", "رمضان", "شوال", "ذو القعدة", "ذو الحجة" +] + +GREGORIAN_MONTHS = [ + "يناير", "فبراير", "مارس", "إبريل", "مايو", "يونيو", + "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" +] + +class HijriDate: + def __init__(self, year: int, month: int, day: int): + self.year = year + self.month = month + self.day = day + + def format(self, lang="ar"): + if lang == "ar": + return f"{self.day} {HIJRI_MONTHS[self.month-1]} {self.year} هـ" + return f"{self.year}-{self.month:02d}-{self.day:02d} AH" + + def __repr__(self): + return self.format() + +# Simplified conversion (accurate approximation using Kuwaiti algorithm) +def to_hijri(gregorian_str: str) -> HijriDate: + """تحويل تاريخ ميلادي إلى هجري""" + g_date = date.fromisoformat(gregorian_str) + jd = int(g_date.toordinal()) + 1721425 # Julian Day + l = jd - 1948440 + 10632 + n = int((l - 1) / 10631) + l = l - 10631 * n + 354 + j = (int((10985 - l) / 5316)) * (int((50 * l) / 17719)) + (int(l / 5670)) * (int((43 * l) / 15238)) + l = l - (int((30 - j) / 15)) * (int((17719 * j) / 50)) - (int(j / 16)) * (int((15238 * j) / 43)) + 29 + month = int((24 * l) / 709) + day = l - int((709 * month) / 24) + year = 30 * n + j - 30 + return HijriDate(year=year, month=month, day=day) + +def to_gregorian(hijri_date: HijriDate) -> date: + """تحويل تاريخ هجري إلى ميلادي (تقريبي)""" + # Placeholder - would use hijri-converter library in production + base = date(622, 7, 16) # 1 محرم 1 هـ + days = (hijri_date.year - 1) * 354 + (hijri_date.month - 1) * 29 + hijri_date.day + return base + timedelta(days=int(days * 0.97)) + +if __name__ == "__main__": + today_hijri = to_hijri("2026-08-05") + print(f"اليوم: {today_hijri.format()}") + print(f"الأشهر الهجرية: {', '.join(HIJRI_MONTHS)}")