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

وحدة:HijriDate: الفرق بين النسختين

من ويكي الاحرار
لا ملخص تعديل
وسم: مسترجع
لا ملخص تعديل
 
(٣ مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر ١: سطر ١:
local p = {}
local p = {}
-- ===== تنظیمات =====
-- اختلاف با تقویم رسمی (مثلاً ایران)
-- اگر تاریخ 2 روز جلوتر است → -2
-- اگر 1 روز عقب‌تر است → +1
local DAY_OFFSET = -2
-- ==================


local months = {
local months = {
[1] = "محرم",
"محرم",
[2] = "صفر",
"صفر",
[3] = "ربيع الأول",
"ربيع الأول",
[4] = "ربيع الآخر",
"ربيع الآخر",
[5] = "جمادى الأولى",
"جمادى الأولى",
[6] = "جمادى الآخرة",
"جمادى الآخرة",
[7] = "رجب",
"رجب",
[8] = "شعبان",
"شعبان",
[9] = "رمضان",
"رمضان",
[10] = "شوال",
"شوال",
[11] = "ذو القعدة",
"ذو القعدة",
[12] = "ذو الحجة"
"ذو الحجة"
}
}


local function gregorian_to_jd(y, m, d)
-- تبدیل میلادی به هجری قمری (Tabular Islamic Calendar)
if m < 3 then
local function gregorian_to_hijri(y, m, d)
y = y - 1
local jd = math.floor(
m = m + 12
(1461 * (y + 4800 + math.floor((m - 14) / 12))) / 4 +
(367 * (m - 2 - 12 * math.floor((m - 14) / 12))) / 12 -
(3 * math.floor((y + 4900 + math.floor((m - 14) / 12)) / 100)) / 4 +
d - 32075
)
 
local l = jd - 1948440 + 10632
local n = math.floor((l - 1) / 10631)
l = l - 10631 * n + 354
local j = (
math.floor((10985 - l) / 5316) *
math.floor((50 * l) / 17719) +
math.floor(l / 5670) *
math.floor((43 * l) / 15238)
)
l = l - (
math.floor((30 - j) / 15) *
math.floor((17719 * j) / 50) -
math.floor(j / 16) *
math.floor((15238 * j) / 43)
) + 29
 
local month = math.floor((24 * l) / 709)
local day = l - math.floor((709 * month) / 24)
local year = 30 * n + j - 30
 
return day, month, year
end
 
-- اصلاح روز با offset و کنترل مرز ماه
local function apply_offset(d, m, y)
d = d + DAY_OFFSET
 
while d < 1 do
m = m - 1
if m < 1 then
m = 12
y = y - 1
end
d = d + 30
end
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)
while d > 30 do
return d
d = d - 30
+ math.ceil(29.5 * (m - 1))
m = m + 1
+ (y - 1) * 354
if m > 12 then
+ math.floor((3 + 11 * y) / 30)
m = 1
+ 1948440
y = y + 1
end
end
end


local function jd_to_hijri(jd)
return d, m, y
local days = jd - 1948440
local year = math.floor((30 * days + 10646) / 10631)
local month = math.min(12, math.ceil((days - 29) / 29.5) + 1)
local day = jd - hijri_to_jd(year, month, 1) + 1
return day, month, year
end
end


function p.today()
function p.today()
local t = os.date("*t")
local t = os.date("*t")
local jd = gregorian_to_jd(t.year, t.month, t.day)
local d, m, y = gregorian_to_hijri(t.year, t.month, t.day)
local d, m, y = jd_to_hijri(jd)
d, m, y = apply_offset(d, m, y)
 
if not months[m] then
return "خطأ في حساب التاريخ الهجري"
end


return d .. " " .. months[m] .. " " .. y .. " هـ"
return d .. " " .. months[m] .. " " .. y .. " هـ"

المراجعة الحالية بتاريخ ١٣:٣٢، ١ يناير ٢٠٢٦

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

local p = {}

-- ===== تنظیمات =====
-- اختلاف با تقویم رسمی (مثلاً ایران)
-- اگر تاریخ 2 روز جلوتر است → -2
-- اگر 1 روز عقب‌تر است → +1
local DAY_OFFSET = -2
-- ==================

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

-- تبدیل میلادی به هجری قمری (Tabular Islamic Calendar)
local function gregorian_to_hijri(y, m, d)
	local jd = math.floor(
		(1461 * (y + 4800 + math.floor((m - 14) / 12))) / 4 +
		(367 * (m - 2 - 12 * math.floor((m - 14) / 12))) / 12 -
		(3 * math.floor((y + 4900 + math.floor((m - 14) / 12)) / 100)) / 4 +
		d - 32075
	)

	local l = jd - 1948440 + 10632
	local n = math.floor((l - 1) / 10631)
	l = l - 10631 * n + 354
	local j = (
		math.floor((10985 - l) / 5316) *
		math.floor((50 * l) / 17719) +
		math.floor(l / 5670) *
		math.floor((43 * l) / 15238)
	)
	l = l - (
		math.floor((30 - j) / 15) *
		math.floor((17719 * j) / 50) -
		math.floor(j / 16) *
		math.floor((15238 * j) / 43)
	) + 29

	local month = math.floor((24 * l) / 709)
	local day = l - math.floor((709 * month) / 24)
	local year = 30 * n + j - 30

	return day, month, year
end

-- اصلاح روز با offset و کنترل مرز ماه
local function apply_offset(d, m, y)
	d = d + DAY_OFFSET

	while d < 1 do
		m = m - 1
		if m < 1 then
			m = 12
			y = y - 1
		end
		d = d + 30
	end

	while d > 30 do
		d = d - 30
		m = m + 1
		if m > 12 then
			m = 1
			y = y + 1
		end
	end

	return d, m, y
end

function p.today()
	local t = os.date("*t")
	local d, m, y = gregorian_to_hijri(t.year, t.month, t.day)
	d, m, y = apply_offset(d, m, y)

	return d .. " " .. months[m] .. " " .. y .. " هـ"
end

return p