انتقل إلى المحتوى

وحدة:HijriDate

من ويكي الاحرار

يمكن إنشاء صفحة توثيق الوحدة في وحدة:HijriDate/شرح

local p = {}

local hijri_months = {
	"محرم",
	"صفر",
	"ربيع الأول",
	"ربيع الآخر",
	"جمادى الأولى",
	"جمادى الآخرة",
	"رجب",
	"شعبان",
	"رمضان",
	"شوال",
	"ذو القعدة",
	"ذو الحجة"
}

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
end

local function hijri_to_jd(y, m, d)
	return d
		+ math.ceil(29.5 * (m - 1))
		+ (y - 1) * 354
		+ math.floor((3 + 11 * y) / 30)
		+ 1948440
end

local function jd_to_hijri(jd)
	local days = jd - 1948440
	local h_year = math.floor((30 * days + 10646) / 10631)
	local first_day = hijri_to_jd(h_year, 1, 1)
	local h_month = math.min(12, math.ceil((jd - first_day) / 29.5) + 1)
	local h_day = jd - hijri_to_jd(h_year, h_month, 1) + 1
	return h_day, h_month, h_year
end

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)

	local month_name = hijri_months[m] or "؟"

	return d .. " " .. month_name .. " " .. y .. " هـ"
end

return p