وحدة:HijriDate: الفرق بين النسختين
المظهر
لا ملخص تعديل |
لا ملخص تعديل |
||
| (١ مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
| سطر ١: | سطر ١: | ||
local p = {} | local p = {} | ||
-- ===== تنظیمات ===== | |||
-- اختلاف با تقویم رسمی (مثلاً ایران) | |||
-- اگر تاریخ 2 روز جلوتر است → -2 | |||
-- اگر 1 روز عقبتر است → +1 | |||
local DAY_OFFSET = -2 | |||
-- ================== | |||
local months = { | local months = { | ||
| سطر ١٦: | سطر ٢٣: | ||
} | } | ||
-- | -- تبدیل میلادی به هجری قمری (Tabular Islamic Calendar) | ||
local function | local function gregorian_to_hijri(y, m, d) | ||
local jd = math.floor( | |||
y | (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 | local n = math.floor((l - 1) / 10631) | ||
l = l - 10631 * n + 354 | |||
local j = ( | |||
local | math.floor((10985 - l) / 5316) * | ||
math.floor((50 * l) / 17719) + | |||
math.floor(l / 5670) * | |||
math. | math.floor((43 * l) / 15238) | ||
) | ) | ||
local day = math.floor( | 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 | return day, month, year | ||
end | end | ||
function | -- اصلاح روز با 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 | end | ||
function p.today() | function p.today() | ||
local t = os.date("*t") | local t = os.date("*t") | ||
local | 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 .. " هـ" | 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