وحدة:HijriDate
المظهر
يمكن إنشاء صفحة توثيق الوحدة في وحدة:HijriDate/شرح
local p = {}
-- تبدیل میلادی به هجری قمری (الگوریتم استاندارد)
local function gregorian_to_jd(y, m, d)
if m <= 2 then
y = y - 1
m = m + 12
end
local A = math.floor(y / 100)
local B = 2 - A + math.floor(A / 4)
return math.floor(365.25 * (y + 4716))
+ math.floor(30.6001 * (m + 1))
+ d + B - 1524.5
end
local function jd_to_hijri(jd)
jd = math.floor(jd) + 0.5
local days = jd - 1948439.5
local h_year = math.floor((30 * days + 10646) / 10631)
local h_month = math.min(12,
math.ceil((days - 29 - hijri_to_jd(h_year, 1, 1)) / 29.5) + 1)
local h_day = math.floor(jd - hijri_to_jd(h_year, h_month, 1)) + 1
return h_day, h_month, h_year
end
function hijri_to_jd(y, m, d)
return d
+ math.ceil(29.5 * (m - 1))
+ (y - 1) * 354
+ math.floor((3 + 11 * y) / 30)
+ 1948439.5
end
local hijri_months = {
"محرم",
"صفر",
"ربيع الأول",
"ربيع الآخر",
"جمادى الأولى",
"جمادى الآخرة",
"رجب",
"شعبان",
"رمضان",
"شوال",
"ذو القعدة",
"ذو الحجة"
}
function p.today()
local t = os.date("*t")
local jd = gregorian_to_jd(t.year, t.month, t.day)
local d, m, y = jd_to_hijri(jd)
return string.format("%d %s %d هـ", d, hijri_months[m], y)
end
return p