יחידה:לוח שנה עברי: הבדלים בין גרסאות בדף
קפיצה לניווט
קפיצה לחיפוש
אין תקציר עריכה |
(ניסוי) |
||
(11 גרסאות ביניים של אותו משתמש אינן מוצגות) | |||
שורה 1: | שורה 1: | ||
local p = {} | local p = {} | ||
function | local function is_leap(year) | ||
-- הפונקציה מקבלת שנה עברית בתור מספר ומחזירה ערך בוליאני האם היא מעוברת | -- הפונקציה מקבלת שנה עברית בתור מספר ומחזירה ערך בוליאני האם היא מעוברת | ||
local leap_year = {0, 3, 6, 8, 11, 14, 17, 19} -- השנים המעוברות בתוך מחזור של 19 שנה | local leap_year = {0, 3, 6, 8, 11, 14, 17, 19} -- השנים המעוברות בתוך מחזור של 19 שנה | ||
שורה 11: | שורה 11: | ||
end | end | ||
function | local function moladTishrei(year) | ||
-- הפונקציה מקבלת שנה עברית בתור מספר ומחזירה את המולד של תשרי בתור טבלה | -- הפונקציה מקבלת שנה עברית בתור מספר ומחזירה את המולד של תשרי בתור טבלה | ||
local years = (year - 1) % 19 -- מספר השנים במחזור שלפני השנה הזו | local years = (year - 1) % 19 -- מספר השנים במחזור שלפני השנה הזו | ||
שורה 29: | שורה 29: | ||
end | end | ||
function | local function first_day(year) | ||
-- מקבלת שנה עברית בתור מספר ומחזירה את היום שבו יחול ראש השנה | -- מקבלת שנה עברית בתור מספר ומחזירה את היום שבו יחול ראש השנה | ||
local molad = moladTishrei(year) | local molad = moladTishrei(year) | ||
שורה 42: | שורה 42: | ||
end | end | ||
function | local function year_type(year) | ||
-- מקבלת שנה עברית בתור מספר ומחזירה את הסוג של השנה כמחרוזת | -- מקבלת שנה עברית בתור מספר ומחזירה את הסוג של השנה כמחרוזת | ||
local difference = (first_day(year + 1) + 7 - first_day(year)) % 7 | local difference = (first_day(year + 1) + 7 - first_day(year)) % 7 | ||
שורה 51: | שורה 51: | ||
end | end | ||
function | local function days_a_month(year, month) | ||
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה את מספר הימים בו | -- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה את מספר הימים בו | ||
local full_months = {"תשרי", "שבט", "אדר א'", "ניסן", " | local full_months = {"תשרי", "שבט", "אדר א'", "ניסן", "סיון", "אב"} | ||
local missing_months = {"טבת", "אדר", "אדר ב'", "אייר", "תמוז", "אלול"} | local missing_months = {"טבת", "אדר", "אדר ב'", "אייר", "תמוז", "אלול"} | ||
for _, value in pairs(full_months) do | for _, value in pairs(full_months) do | ||
שורה 61: | שורה 61: | ||
if month == value then return 29 end | if month == value then return 29 end | ||
end | end | ||
if month == " | if month == "חשון" then | ||
if year_type(year) == "שלמה" then return 30 else return 29 end | if year_type(year) == "שלמה" then return 30 else return 29 end | ||
end | end | ||
שורה 69: | שורה 69: | ||
end | end | ||
function | local function return_month(year, month, previous) | ||
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה את החודש הקודם או הבא | -- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה את החודש הקודם או הבא | ||
local months = {"תשרי", "חשון", "כסלו", "טבת", "שבט", "אדר", "ניסן", "אייר", "סיון", "תמוז", "אב", "אלול"} | local months = {"תשרי", "חשון", "כסלו", "טבת", "שבט", "אדר", "ניסן", "אייר", "סיון", "תמוז", "אב", "אלול"} | ||
שורה 83: | שורה 83: | ||
end | end | ||
end | end | ||
return error("שם חודש לא מוכר") | return error("שם חודש לא מוכר: " .. month) | ||
end | end | ||
function | local function return_day(year, month, day, previous) | ||
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ויום בחודש בתור מספר ומחזירה את היום הקודם (ברירת מחדל) או הבא | -- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ויום בחודש בתור מספר ומחזירה את היום הקודם (ברירת מחדל) או הבא | ||
if day > days_a_month(year, month) then return error("תאריך לא תקין") end | |||
if previous then | if previous then | ||
if day == 1 then return days_a_month(year, return_month(year, month, true)) else return day - 1 end | if day == 1 then return days_a_month(year, return_month(year, month, true)) else return day - 1 end | ||
שורה 95: | שורה 96: | ||
end | end | ||
function p.next_month( | function p.next_month(frame) | ||
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה | -- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה מחרוזת עם השנה והחודש מופרדים בפסיק | ||
local year = tonumber(frame.args["year"]) | |||
local month = frame.args["month"] | |||
month = return_month(year, month, false) | month = return_month(year, month, false) | ||
if month == "תשרי" then year = year + 1 end | if month == "תשרי" then year = year + 1 end | ||
return | return month .. "/" .. year | ||
end | end | ||
function p.previous_month( | function p.previous_month(frame) | ||
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה טבלה עם החודש הקודם | -- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה טבלה עם החודש הקודם | ||
local year = tonumber(frame.args["year"]) | |||
local month = frame.args["month"] | |||
month = return_month(year, month, true) | month = return_month(year, month, true) | ||
if month == "אלול" then year = year - 1 end | if month == "אלול" then year = year - 1 end | ||
return | return month .. "/" .. year | ||
end | end | ||
function p.next_date( | function p.next_date(frame) | ||
-- מקבלת תאריך מלא ומחזירה טבלה עם התאריך המלא הבא | -- מקבלת תאריך מלא ומחזירה טבלה עם התאריך המלא הבא | ||
local year = tonumber(frame.args["year"]) | |||
local month = frame.args["month"] | |||
local day = tonumber(frame.args["day"]) | |||
day = return_day(year, month, day, false) | day = return_day(year, month, day, false) | ||
if day == 1 then | if day == 1 then | ||
שורה 116: | שורה 124: | ||
if month == "תשרי" then year = year + 1 end | if month == "תשרי" then year = year + 1 end | ||
end | end | ||
return | return day .. "/" .. month .. "/" .. year | ||
end | end | ||
function p.previous_date( | function p.previous_date(frame) | ||
-- מקבלת תאריך מלא ומחזירה טבלה עם התאריך המלא הקודם | -- מקבלת תאריך מלא ומחזירה טבלה עם התאריך המלא הקודם | ||
new_day = return_day(year, month, day, true) | local year = tonumber(frame.args["year"]) | ||
local month = frame.args["month"] | |||
local day = tonumber(frame.args["day"]) | |||
local new_day = return_day(year, month, day, true) | |||
if day == 1 then | if day == 1 then | ||
if month == "תשרי" then year = year - 1 end | if month == "תשרי" then year = year - 1 end | ||
month = return_month(year, month, true) | month = return_month(year, month, true) | ||
end | end | ||
return | return new_day .. "/" .. month .. "/" .. year | ||
end | end | ||
return p | return p |
גרסה אחרונה מ־00:52, 7 ביולי 2024
היחידה מכילה פונקציות מועילות רבות לחישוב תאריכים עבריים, אבל היא מחזירה רק 4 פונקציות, שממומשות בתבניות {{חודש קודם}}, {{חודש הבא}}, {{תאריך קודם}}, {{תאריך הבא}}, ראו שם הסברים.
אם יש צורך בפונקציות נוספות כגון בדיקה האם שנה היא מעוברת, חישוב מולדות, בדיקת היום שבו חל ראש השנה, החזרת מספר הימים בחודש נתון, בדיקה מה הסוג של שנה נתונה - ניתן לבקש זאת ממשתמש:עמד.
local p = {}
local function is_leap(year)
-- הפונקציה מקבלת שנה עברית בתור מספר ומחזירה ערך בוליאני האם היא מעוברת
local leap_year = {0, 3, 6, 8, 11, 14, 17, 19} -- השנים המעוברות בתוך מחזור של 19 שנה
for _, value in pairs(leap_year) do
if (year % 19) == value then
return true end
end
return false
end
local function moladTishrei(year)
-- הפונקציה מקבלת שנה עברית בתור מספר ומחזירה את המולד של תשרי בתור טבלה
local years = (year - 1) % 19 -- מספר השנים במחזור שלפני השנה הזו
local months = (year - 1 - years) * 235 / 19 -- מספר החודשים בכל המחזורים מבריאת העולם
for y = 1, years do -- הוספת החודשים של המחזור הנוכחי לסכום
if is_leap(y)
then months = months + 13
else months = months + 12 end
end
local all_parts = (months * 39673 + 57444) % 181440 -- הכפלת מספר החודשים בא'-י"ב-תשצ"ג, הוספת ב'-ה'-ר"ד וחלוקה במספר החלקים בשבעה ימים
local parts = all_parts % 1080
local all_hours = (all_parts - parts) / 1080
local hours = all_hours % 24
local days = (all_hours - hours) / 24
if days == 0 then days = 7 end
return {days, hours, parts}
end
local function first_day(year)
-- מקבלת שנה עברית בתור מספר ומחזירה את היום שבו יחול ראש השנה
local molad = moladTishrei(year)
local day, hours, parts = molad[1], molad[2], molad[3]
local old_molad = hours > 18 or (hours == 18 and parts > 0) -- מולד זקן
local g_t_rd = day == 3 and (hours > 9 or (hours == 9 and parts >= 204)) and not is_leap(year) -- ג'-ט'-ר"ד בשנה פשוטה
local b_tv_tkpt = is_leap(year - 1) and day == 2 and (hours > 15 or (hours == 15 and parts >= 589)) -- ב'-ט"ו-תקפ"ט אחר עיבור
if old_molad or g_t_rd or b_tv_tkpt then day = day + 1 end
if day == 8 then day = 2 end
if day == 1 or day == 4 or day == 6 then day = day + 1 end -- לא אד"ו ראש
return day
end
local function year_type(year)
-- מקבלת שנה עברית בתור מספר ומחזירה את הסוג של השנה כמחרוזת
local difference = (first_day(year + 1) + 7 - first_day(year)) % 7
if difference == 0 then difference = 7 end
if difference == 3 or (is_leap(year) and difference == 5) then return "חסרה" end
if difference == 4 or difference == 6 then return "כסדרה" end
if (difference == 5 and not is_leap(year)) or difference == 7 then return "שלמה" end
end
local function days_a_month(year, month)
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה את מספר הימים בו
local full_months = {"תשרי", "שבט", "אדר א'", "ניסן", "סיון", "אב"}
local missing_months = {"טבת", "אדר", "אדר ב'", "אייר", "תמוז", "אלול"}
for _, value in pairs(full_months) do
if month == value then return 30 end
end
for _, value in pairs(missing_months) do
if month == value then return 29 end
end
if month == "חשון" then
if year_type(year) == "שלמה" then return 30 else return 29 end
end
if month == "כסלו" then
if year_type(year) == "חסרה" then return 29 else return 30 end
end
end
local function return_month(year, month, previous)
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה את החודש הקודם או הבא
local months = {"תשרי", "חשון", "כסלו", "טבת", "שבט", "אדר", "ניסן", "אייר", "סיון", "תמוז", "אב", "אלול"}
if is_leap(year) then
months = {"תשרי", "חשון", "כסלו", "טבת", "שבט", "אדר א'", "אדר ב'", "ניסן", "אייר", "סיון", "תמוז", "אב", "אלול"}
end
for index, value in pairs(months) do
if month == value then
if previous then
if month == "תשרי" then return "אלול" else return months[index - 1] end
else if month == "אלול" then return "תשרי" else return months[index + 1] end
end
end
end
return error("שם חודש לא מוכר: " .. month)
end
local function return_day(year, month, day, previous)
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ויום בחודש בתור מספר ומחזירה את היום הקודם (ברירת מחדל) או הבא
if day > days_a_month(year, month) then return error("תאריך לא תקין") end
if previous then
if day == 1 then return days_a_month(year, return_month(year, month, true)) else return day - 1 end
else if day == days_a_month(year, month) then return 1 else return day + 1 end
end
return error("שגיאת תאריך")
end
function p.next_month(frame)
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה מחרוזת עם השנה והחודש מופרדים בפסיק
local year = tonumber(frame.args["year"])
local month = frame.args["month"]
month = return_month(year, month, false)
if month == "תשרי" then year = year + 1 end
return month .. "/" .. year
end
function p.previous_month(frame)
-- מקבלת שנה עברית בתור מספר וחודש בתור מחרוזת ומחזירה טבלה עם החודש הקודם
local year = tonumber(frame.args["year"])
local month = frame.args["month"]
month = return_month(year, month, true)
if month == "אלול" then year = year - 1 end
return month .. "/" .. year
end
function p.next_date(frame)
-- מקבלת תאריך מלא ומחזירה טבלה עם התאריך המלא הבא
local year = tonumber(frame.args["year"])
local month = frame.args["month"]
local day = tonumber(frame.args["day"])
day = return_day(year, month, day, false)
if day == 1 then
month = return_month(year, month, false)
if month == "תשרי" then year = year + 1 end
end
return day .. "/" .. month .. "/" .. year
end
function p.previous_date(frame)
-- מקבלת תאריך מלא ומחזירה טבלה עם התאריך המלא הקודם
local year = tonumber(frame.args["year"])
local month = frame.args["month"]
local day = tonumber(frame.args["day"])
local new_day = return_day(year, month, day, true)
if day == 1 then
if month == "תשרי" then year = year - 1 end
month = return_month(year, month, true)
end
return new_day .. "/" .. month .. "/" .. year
end
return p