לדלג לתוכן

יחידה:תאריך: הבדלים בין גרסאות בדף

מתוך צפונות ויקי
יצירת דף עם התוכן "function parseStrDate(frame) local dateStr = frame.args[1] local dates = { ['ינואר']= 1, ['פברואר']= 2, ['מרץ']= 3, ['אפריל']= 4,..."
 
מאין תקציר עריכה
שורה 1: שורה 1:
function parseStrDate(frame)
function parseStrDate(dateStr, dateType)
local dateStr = frame.args[1]
--local dateStr = frame.args[1]
--local dateType = frame.args[2]
local dates = {
local dates = {
['ינואר']= 1,
['ינואר']= 1,
שורה 19: שורה 20:
-- replace month names to numbers
-- replace month names to numbers
for a in pairs(dates) do
for a in pairs(dates) do
dateStr = mw.ustring.gsub(dateStr, 'ב'..a, dates[a])  
dateStr = mw.ustring.gsub(dateStr, 'ב?'..a, dates[a])  
end
end
-- if there are alhpabet chars return nil (unexpected character)
-- if there are alhpabet chars return nil (unexpected character)
if mw.ustring.find(dateStr, '%a') then
assert(not mw.ustring.find(dateStr, '%a'), "Unexpected format")
return nil
end
 
 
local parts = mw.text.split(dateStr,' ')
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]
local dateType = frame.args[2]
local res
if dateType =='שנה' then
if dateType=='שנה' then
dateType = 'Y'
res = parts[3]
elseif dateType=='חודש' then
elseif dateType=='חודש' then
res = parts[2]
dateType = 'M'
elseif dateType=='יום' then
elseif dateType=='יום' then
res = parts[1]
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 res
end
end


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

גרסה מ־12:00, 29 ביולי 2014

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

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

חשב

פורמט דוגמה תוצאה
יום {{#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
}