לדלג לתוכן

יחידה:תאריך

מתוך צפונות ויקי

יחידה זו מיועדת לביצוע פעולות נפוצות על תאריכים.

  • #חשב - מקבלת תאריך טקסטואלי ופורמט ומחלצת את מהתאריך את הפורמט הרצוי
  • #חשב טווח - מקבלת טווח תאריכים ומחשבת את ההפרש ביניהם

חשב

פורמט דוגמה תוצאה
יום {{#invoke:תאריך|חשב|[[3 בפברואר]] [[2013]]|יום}} 3
יום {{#invoke:תאריך|חשב|[[3 בפברואר]] [[2013]]{{הערה|א}}|יום}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
חודש {{#invoke:תאריך|חשב|[[3 בפברואר]] [[2013]]|חודש}} 2
שנה {{#invoke:תאריך|חשב|[[3 בפברואר]] [[2013]]|שנה}} 2013
שנה {{#invoke:תאריך|חשב|[[פברואר]] [[2013]]|שנה}} 2013
TS {{#invoke:תאריך|חשב|[[3 בפברואר]] [[2013]]|TS}} 2013-2-3

הערות:

  • פורמט TS ניתן להעביר לפונקציות זמן של הוראות תנאי.
  • ההמרה מתעלמת מסוגריים מרובעות של קישורים
  • ניתן להוסיף פרמטר error והתוכן שלו יוצג במקרה של שגיאה בתאריך. (רצוי להכניס במקרה כזה את הדף לקטגוריה כלשהי שתאפשר מעקב אחרי דפים לא תקינים. ברירת המחדל היא קטגוריה:דפים עם שגיאות בתאריך)

חשב טווח

דוגמה תוצאה
פורמט ברירת מחדל: אוטומטי {{#invoke:תאריך|חשב טווח|[[3 בפברואר]] [[1947]] - [[15 בספטמבר]] [[2013]]}} 66 שנים וגם 224 ימים
פורמט ברירת מחדל: אוטומטי (דוגמה עם שנים וסימן מינוס) {{#invoke:תאריך|חשב טווח|1947 - 2013}} 66 שנים
פורמט ברירת מחדל: אוטומטי (דוגמה עם שנים וסימן קו מפריד) {{#invoke:תאריך|חשב טווח|1947–2013}} שגיאת תאריך: mw.lua:143: field 'year' missing in date table
שנים {{#invoke:תאריך|חשב טווח|[[3 בפברואר]] [[1947]] - [[15 בספטמבר]] [[2013]]|שנים}} 66 שנים
גיל {{#invoke:תאריך|חשב טווח|1 במרץ 1922 - 4 בנובמבר 1995|גיל}} 73 שנים וגם 248 ימים
גיל {{#invoke:תאריך|חשב טווח|1 במרץ 1922{{הערה|ב}} - 4 בנובמבר 1995|גיל}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
גיל {{#invoke:תאריך|חשב טווח|1 במרץ 1994{{הערה|ב}} - 4 בנובמבר 1995|גיל}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
גיל {{#invoke:תאריך|חשב טווח|1 במרץ 1993{{הערה|ב}} - 4 בנובמבר 1995|גיל}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
מספר {{#invoke:תאריך|חשב טווח|1 במרץ 1922 - 4 בנובמבר 1995|מספר}} 73 שנים וגם 248 ימים
מספר {{#invoke:תאריך|חשב טווח|1 במרץ 1922{{הערה|ב}} - 4 בנובמבר 1995|מספר}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
מספר {{#invoke:תאריך|חשב טווח|1 במרץ 1994{{הערה|ב}} - 4 בנובמבר 1995|מספר}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
מספר {{#invoke:תאריך|חשב טווח|1 במרץ 1993{{הערה|ב}} - 4 בנובמבר 1995|מספר}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
שנים לפנה"ס {{#invoke:תאריך|חשב טווח|[[3 בפברואר]] 1900 לפנה"ס - [[15 בספטמבר]] [[2013]]|שנים}} שגיאת תאריך: יחידה:תאריך:25: Unexpected format
ימים {{#invoke:תאריך|חשב טווח|[[3 בפברואר]] [[1947]] - [[15 בספטמבר]] [[2013]]|ימים}} 24,331 ימים
הפרש {{#invoke:תאריך|חשב טווח|[[3 בפברואר]] [[1947]] - [[15 בספטמבר]] [[2013]]|הפרש}} 66 שנים וגם 224 ימים
ללא תאריך יעד {{#invoke:תאריך|חשב טווח|[[3 בפברואר]] [[1947]]|שנים}} 79 שנים
לא כולל היום האחרון {{#invoke:תאריך|חשב טווח|5 ביוני 1967 - 10 ביוני 1967}} 5 ימים
כולל היום האחרון {{#invoke:תאריך|חשב טווח|5 ביוני 1967 - 10 ביוני 1967|כולל=כן}} 5 ימים
כולל היום האחרון {{#invoke:תאריך|חשב טווח|14 ספטמבר 2014 - 14 ספטמבר 2014|כולל=כן}} 0 ימים
שנה ויום {{#invoke:תאריך|חשב טווח|14 ספטמבר 2014 - 15 ספטמבר 2015|כולל=כן}} שנה

הערות:

  • כאשר לא ניתן תאריך יעד תאריך היעד נקבע כזמן הנוכחי
  • הפרש - מציין את הפרש הזמנים בשניות וללא מילים. ניתן להשתמש בערך המוחזר בחלוקה מתאימה לקבלת יחידות זמן אחרות.
  • ניתן להוסיף פרמטר כולל=כן, ואז נלקח בחשבון גם היום האחרון. כשמדובר על טווח זמן ארוך והפורמט נבחר אוטומטי או שמכיל שנים, מתקבלת תוצאה מקורבת.
  • ניתן להוסיף פרמטר error והתוכן שלו יוצג במקרה של שגיאה בטווח התאריכים. (רצוי להכניס במקרה כזה את הדף לקטגוריה כלשהי שתאפשר מעקב אחרי דפים לא תקינים. ברירת המחדל היא קטגוריה:דפים עם שגיאות בתאריך)
  • אם לא מצוין פורמט, הוא נבחר אוטומטית:
    • עד ל-3 שבועות הוא מוצג בימים
    • עד שנה הוא מוצג בימים ושבועות
    • עד ל-10 שנים בשנים ושבועות
    • מעבר לזה רק בשנים

בדיקות

דוגמאות לשימוש ביחידה ופלט לדוגמה מודגמים ביחידה:תאריך/בדיקות.


  1. ^ א
  2. ^ ב
  3. ^ ב
  4. ^ ב
  5. ^ ב
  6. ^ ב
  7. ^ ב
function parseStrDate(dateStr, dateType)
	--local dateStr = frame.args[1]
	--local dateType = frame.args[2]
	local dates = {
		['ינואר']= 1,
		['פברואר']= 2,
		['מרץ']= 3,
		['אפריל']= 4,
		['מאי']= 5,
		['יוני']= 6,
		['יולי']= 7,
		['אוגוסט']= 8,
		['ספטמבר']= 9,
		['אוקטובר']= 10,
		['נובמבר']= 11,
		['דצמבר']= 12
	}
	dateStr = mw.ustring.gsub( dateStr, "[%[%]]", "" )

	-- replace month names to numbers
	for a in pairs(dates) do
		dateStr = mw.ustring.gsub(dateStr, 'ב?'..a, dates[a]) 
	end
	-- if there are alhpabet chars return nil (unexpected character)
	assert(not mw.ustring.find(dateStr, '%a'), "Unexpected format")
 	
	local parts = mw.text.split(dateStr,' ')
	local res
	if dateType == 'TS' then
		for i, part in pairs(parts) do
			if not res then
				res=part
			else
				res=part..'-'..res
			end
		end
	else
		-- dmy date
		if #parts==3 then
			if dateType=='Y' then
				res = tonumber(parts[3])
			elseif dateType=='M' then
				res = tonumber(parts[2])
				assert(res<13 and res>0, "Month must be in range 1-12")
			elseif dateType=='D' then
				res = tonumber(parts[1])
				assert(res<32 and res>0, "Day must be in range 1-31")
			end
		elseif  #parts==2 then -- MY date
			if dateType=='Y' then
				res = tonumber(parts[2])
			elseif dateType=='M' then
				res = tonumber(parts[1])
				assert(res<13 and res>0, "Month must be in range 1-12")
			end
		elseif #parts==1 then --Y date
			if dateType=='Y' then
				res = tonumber(parts[1])
			end
		else
			error("Unexpected date format")
		end
	end
	return res
end

function parseDateRange(dateRangeStr, diffFormat)
	local parts = mw.text.split(dateRangeStr,' +- +')
	assert(#parts==2 or #parts==1, "Date range expected format is from - to or from (e.g from - now)")
	
	-- parse dates
	local res1 = parseStrDate(parts[1], 'TS' )
	local year1, month1, day1 = unpack(mw.text.split(res1, '-'))
	
	--assign default value
	month1 = month1 or 1
	day1 = day1 or 1
	
	local t1 = os.time({
		year = year1,--year1,
		month = month1,
		day = day1
		})
	
	local t2
	if #parts==2 then
		local res2 = parseStrDate( parts[2], 'TS' )
		local year2, month2, day2 = unpack(mw.text.split(res2, '-'))
		month2 = month2 or 1
		day2 = day2 or 1
		t2 = os.time({
			year = year2,
			month = month2,
			day = day2
			})
	else
		t2 = os.time()
	end
	
	local lang = mw.getContentLanguage()
	return lang:formatDuration(os.difftime (t2, t1), diffFormat)
	
end

function parseDateRangeSafe(frame)
	local diffFormat = {'years', 'days'}
	if frame.args[2] == 'ימים' then
		diffFormat = {'days'}
	elseif frame.args[2] == 'שנים' then
		diffFormat = {'years'}
	end
	local success, res = pcall(parseDateRange, frame.args[1], diffFormat)
	if success then
		return res
	else
		return '<span class="scribunto-error">שגיאת תאריך: '..res..'</span>[[קטגוריה:דפים עם שגיאות טכניות]]'
	end
end

function parseStrDateSafe(frame)
	local dateType = frame.args[2]
	if dateType =='שנה' then
		dateType = 'Y'
	elseif dateType=='חודש' then
		dateType = 'M'
	elseif dateType=='יום' then
		dateType='D'
	end
	
	local success, res = pcall( parseStrDate, frame.args[1], dateType )
	if success then
		return res
	else
		return '<span class="scribunto-error">שגיאת תאריך: '..res..'</span>[[קטגוריה:דפים עם שגיאות טכניות]]'
	end
end

return {
	['חשב'] = parseStrDateSafe,
	['חשב טווח'] =  parseDateRangeSafe
}