<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>https://enciclopedia.md/index.php?action=history&amp;feed=atom&amp;title=Modul%3ADateUtils</id>
	<title>Modul:DateUtils - Revizia istoricului</title>
	<link rel="self" type="application/atom+xml" href="https://enciclopedia.md/index.php?action=history&amp;feed=atom&amp;title=Modul%3ADateUtils"/>
	<link rel="alternate" type="text/html" href="https://enciclopedia.md/index.php?title=Modul:DateUtils&amp;action=history"/>
	<updated>2026-06-06T12:18:29Z</updated>
	<subtitle>Istoricul versiunilor pentru această pagină din wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://enciclopedia.md/index.php?title=Modul:DateUtils&amp;diff=337&amp;oldid=prev</id>
		<title>Sergiu: Pagină nouă: local p = {} local maxDaysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local roman = require(&#039;Modul:Roman&#039;) local getArgs = require(&#039;Modul:Arguments&#039;).getArgs local defaultPostfixYear = { bc = &#039;î.Hr.&#039;, ad = &#039;d.Hr.&#039; } local linkingPostfixYear = { bc = &#039;î.Hr.&#039;, ad = &#039;d.Hr.&#039; } local months = mw.loadData(&#039;Modul:DateUtils/data&#039;).months  local suffixFormatYear = function(y, postFixYear) 	local postFixYear = postFixYear or defaultPostfixYear 	return (y &lt; 0 and (&#039; &#039; ....</title>
		<link rel="alternate" type="text/html" href="https://enciclopedia.md/index.php?title=Modul:DateUtils&amp;diff=337&amp;oldid=prev"/>
		<updated>2024-07-14T20:08:59Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: local p = {} local maxDaysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local roman = require(&amp;#039;Modul:Roman&amp;#039;) local getArgs = require(&amp;#039;Modul:Arguments&amp;#039;).getArgs local defaultPostfixYear = { bc = &amp;#039;î.Hr.&amp;#039;, ad = &amp;#039;d.Hr.&amp;#039; } local linkingPostfixYear = { bc = &amp;#039;î.Hr.&amp;#039;, ad = &amp;#039;d.Hr.&amp;#039; } local months = mw.loadData(&amp;#039;Modul:DateUtils/data&amp;#039;).months  local suffixFormatYear = function(y, postFixYear) 	local postFixYear = postFixYear or defaultPostfixYear 	return (y &amp;lt; 0 and (&amp;#039; &amp;#039; ....&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pagină nouă&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local maxDaysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}&lt;br /&gt;
local roman = require(&amp;#039;Modul:Roman&amp;#039;)&lt;br /&gt;
local getArgs = require(&amp;#039;Modul:Arguments&amp;#039;).getArgs&lt;br /&gt;
local defaultPostfixYear = { bc = &amp;#039;î.Hr.&amp;#039;, ad = &amp;#039;d.Hr.&amp;#039; }&lt;br /&gt;
local linkingPostfixYear = { bc = &amp;#039;î.Hr.&amp;#039;, ad = &amp;#039;d.Hr.&amp;#039; }&lt;br /&gt;
local months = mw.loadData(&amp;#039;Modul:DateUtils/data&amp;#039;).months&lt;br /&gt;
&lt;br /&gt;
local suffixFormatYear = function(y, postFixYear)&lt;br /&gt;
	local postFixYear = postFixYear or defaultPostfixYear&lt;br /&gt;
	return (y &amp;lt; 0 and (&amp;#039; &amp;#039; .. postFixYear.bc) or (y &amp;lt; 1000 and (&amp;#039; &amp;#039; .. postFixYear.ad) or &amp;#039;&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.formatYear = function(y, link)&lt;br /&gt;
	local out = &amp;#039;&amp;#039;&lt;br /&gt;
	local yearLink = tostring(math.abs(y)) .. (y &amp;lt; 0 and suffixFormatYear(y, linkingPostfixYear) or &amp;#039;&amp;#039;)&lt;br /&gt;
	local yearLabel = tostring(math.abs(y)) .. suffixFormatYear(y, defaultPostfixYear)&lt;br /&gt;
	if link then&lt;br /&gt;
		out = out .. &amp;#039;[[&amp;#039;&lt;br /&gt;
		if yearLabel == yearLink then out = out .. yearLink&lt;br /&gt;
		else out = out .. yearLink .. &amp;#039;|&amp;#039; .. yearLabel end&lt;br /&gt;
		out = out .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		out = yearLabel&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.surroundWithTimeTag = function(out, tagDate)&lt;br /&gt;
	local timeTag = mw.html.create(&amp;#039;time&amp;#039;)&lt;br /&gt;
	if tagDate.year &amp;gt; 0 then &lt;br /&gt;
		local datetimeFormat = &amp;#039;Y-m-d&amp;#039;&lt;br /&gt;
		if tagDate.precision == 10 then&lt;br /&gt;
			datetimeFormat = &amp;#039;Y-m&amp;#039;&lt;br /&gt;
			tagDate.day = 1&lt;br /&gt;
		end&lt;br /&gt;
		local intermediateFormatDate =  os.date(&amp;#039;%d %B %Y&amp;#039;, os.time(tagDate))&lt;br /&gt;
		timeTag:attr(&amp;#039;datetime&amp;#039;, mw.language.getContentLanguage():formatDate(datetimeFormat, intermediateFormatDate))&lt;br /&gt;
	end&lt;br /&gt;
	timeTag:wikitext(out)&lt;br /&gt;
	&lt;br /&gt;
	return tostring(timeTag)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.formatDate = function(indate, link, notimetag, dateFormat)&lt;br /&gt;
	if not indate then return nil end&lt;br /&gt;
	if indate.precision == 6 then&lt;br /&gt;
		local out = &amp;#039;mileniul &amp;#039;&lt;br /&gt;
		if indate.year &amp;gt;= 2000 or indate.year &amp;lt;= -2000 then out = out .. &amp;#039;al &amp;#039; end&lt;br /&gt;
		out = out .. roman.main({tostring(1 + math.floor((math.abs(indate.year) - 1) / 1000))})&lt;br /&gt;
		if indate.year &amp;gt;= 2000 or indate.year &amp;lt;= -2000 then out = out .. &amp;#039;-lea&amp;#039; end&lt;br /&gt;
		out = out .. suffixFormatYear(indate.year)&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	if indate.precision == 7 then&lt;br /&gt;
		local out = &amp;#039;secolul &amp;#039;&lt;br /&gt;
		if indate.year &amp;gt;= 200 or indate.year &amp;lt;= -200 then out = out .. &amp;#039;al &amp;#039; end&lt;br /&gt;
		out = out .. roman.main({tostring(1 + math.floor((math.abs(indate.year) - 1) / 100))})&lt;br /&gt;
		if indate.year &amp;gt;= 200 or indate.year &amp;lt;= -200 then out = out .. &amp;#039;-lea&amp;#039; end&lt;br /&gt;
		out = out .. suffixFormatYear(indate.year)&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	if indate.precision == 8 then&lt;br /&gt;
		return &amp;#039;anii &amp;#039; .. tostring(math.floor(math.abs(indate.year) / 10) * 10) .. suffixFormatYear(indate.year)&lt;br /&gt;
	end&lt;br /&gt;
	if indate.precision == 9 then&lt;br /&gt;
		if notimetag then return p.formatYear(indate.year, link) end&lt;br /&gt;
		local timeTag = mw.html.create(&amp;#039;time&amp;#039;)&lt;br /&gt;
		if indate.year &amp;gt; 0 then timeTag:attr(&amp;#039;datetime&amp;#039;, tostring(indate.year)) end&lt;br /&gt;
		timeTag:wikitext(p.formatYear(indate.year, link))&lt;br /&gt;
		return tostring(timeTag)&lt;br /&gt;
	end&lt;br /&gt;
	if indate.precision and indate.precision &amp;gt; 9  then&lt;br /&gt;
		local d1 = {}&lt;br /&gt;
		d1.day = indate.day&lt;br /&gt;
		if not d1.day or d1.day == 0 then d1.day = 1 end&lt;br /&gt;
		d1.month = indate.month&lt;br /&gt;
		if not d1.month or d1.month == 0 then d1.month = 1 end&lt;br /&gt;
		d1.year = math.abs(indate.year)&lt;br /&gt;
		local out = &amp;#039;&amp;#039;&lt;br /&gt;
		local intermediateFormatDate = os.date(&amp;#039;%d %B %Y&amp;#039;, os.time(d1))&lt;br /&gt;
		if dateFormat then&lt;br /&gt;
			out = out .. mw.language.getContentLanguage():formatDate(dateFormat, intermediateFormatDate)&lt;br /&gt;
		else&lt;br /&gt;
			out = out .. mw.language.getContentLanguage():formatDate((indate.precision &amp;gt;= 11) and (link and &amp;#039;[[j F]]&amp;#039; or &amp;#039;j F&amp;#039;) or (link and &amp;#039;[[F]]&amp;#039; or &amp;#039;F&amp;#039;), intermediateFormatDate)&lt;br /&gt;
			out = out .. &amp;#039; &amp;#039; .. p.formatYear(indate.year, link)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if notimetag or indate.precision &amp;lt; 11 then return out end&lt;br /&gt;
		&lt;br /&gt;
		return p.surroundWithTimeTag(out, indate)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.formatDateFromFrame = function(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local dateObj = {}&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		dateObj = p.parseDate(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		dateObj.month = tonumber(months[args[2]] or args[2])&lt;br /&gt;
		if args[3] then dateObj.day = tonumber(args[3]) end&lt;br /&gt;
	end&lt;br /&gt;
	dateObj.calendar = &amp;#039;gregorian&amp;#039;&lt;br /&gt;
	if not dateObj.precision then&lt;br /&gt;
		dateObj.precision = 9&lt;br /&gt;
	end&lt;br /&gt;
	if args[2] ~= nil then&lt;br /&gt;
		dateObj.precision = 10&lt;br /&gt;
		if args[3] ~= nil then&lt;br /&gt;
			dateObj.precision = 11&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return p.formatDate(dateObj, args[&amp;#039;link&amp;#039;] ~= nil, args[&amp;#039;notimetag&amp;#039;] ~= nil)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isDateGregorian = function(indate)&lt;br /&gt;
	return indate.calendarmodel == &amp;#039;http://www.wikidata.org/entity/Q1985727&amp;#039; or indate.calendarmodel == &amp;#039;http://www.wikidata.org/entity/Q12138&amp;#039; or indate.calendar == &amp;#039;gregorian&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isDateJulian = function(indate)&lt;br /&gt;
	return indate.calendarmodel == &amp;#039;http://www.wikidata.org/entity/Q1985786&amp;#039; or indate.calendarmodel == &amp;#039;http://www.wikidata.org/entity/Q11184&amp;#039; or indate.calendar == &amp;#039;julian&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isLeapYearGregorian = function(year)&lt;br /&gt;
	if (year % 4 ~= 0) then return false&lt;br /&gt;
	elseif (year % 100 ~= 0) then return true&lt;br /&gt;
	elseif (year % 400 ~= 0) then return false&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.isDateInLeapYear = function(indate)&lt;br /&gt;
	if p.isDateJulian(indate) then&lt;br /&gt;
		return 0 == indate.year % 4&lt;br /&gt;
	end&lt;br /&gt;
	return p.isLeapYearGregorian(indate.year)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.addDaysToDate = function(indate, days)&lt;br /&gt;
	local outdate = mw.clone(indate)&lt;br /&gt;
&lt;br /&gt;
	if outdate.day == nil then return outdate end -- incompletely specified dates&lt;br /&gt;
	outdate.day = outdate.day + days&lt;br /&gt;
	local lastDayOfMonth = maxDaysInMonth[math.fmod(outdate.month-1, 12)+1]&lt;br /&gt;
	while outdate.day &amp;gt; lastDayOfMonth do&lt;br /&gt;
	    mw.logObject(outdate, &amp;quot;outdate&amp;quot;)&lt;br /&gt;
		lastDayOfMonth = maxDaysInMonth[math.fmod(outdate.month-1, 12)+1]&lt;br /&gt;
		if outdate.month == 2 and p.isDateInLeapYear(outdate) then lastDayOfMonth = 29 end&lt;br /&gt;
		outdate.month = outdate.month + 1&lt;br /&gt;
		outdate.day = outdate.day - lastDayOfMonth&lt;br /&gt;
	end&lt;br /&gt;
	while outdate.month &amp;gt; 12 do&lt;br /&gt;
		outdate.year = outdate.year + 1&lt;br /&gt;
		outdate.month = outdate.month - 12&lt;br /&gt;
	end&lt;br /&gt;
	return outdate&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.parseCentury = function(datetext)&lt;br /&gt;
	if datetext and mw.ustring.len(datetext) &amp;lt; 9 then return nil end&lt;br /&gt;
	local centuryPrefixExpected = mw.ustring.sub(mw.ustring.lower(datetext), 1, 7)&lt;br /&gt;
	if centuryPrefixExpected == &amp;#039;secolul&amp;#039; then&lt;br /&gt;
		local alLeaMatcherFunction = mw.ustring.gmatch(mw.ustring.lower(datetext), &amp;#039;%s+al%s+([xivlcm]+)%-lea&amp;#039;)&lt;br /&gt;
		local centNum = nil&lt;br /&gt;
		local centStr = nil&lt;br /&gt;
		if alLeaMatcherFunction then&lt;br /&gt;
			centStr = alLeaMatcherFunction()&lt;br /&gt;
		end&lt;br /&gt;
		if not centStr then&lt;br /&gt;
			local nonAlLEaMatcherFunction = mw.ustring.gmatch(mw.ustring.lower(datetext), &amp;#039;%s+([xivlcm]+)%s*&amp;#039;)&lt;br /&gt;
			if nonAlLEaMatcherFunction then&lt;br /&gt;
				centStr = nonAlLEaMatcherFunction()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not centStr then return nil end&lt;br /&gt;
		local romanTestIdx = 1&lt;br /&gt;
		while romanTestIdx &amp;lt; 30 do&lt;br /&gt;
			if mw.ustring.lower(roman.main({tostring(romanTestIdx)})) == mw.ustring.lower(centStr) then&lt;br /&gt;
				centNum = romanTestIdx&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			romanTestIdx = romanTestIdx + 1&lt;br /&gt;
		end&lt;br /&gt;
		if not centNum then return nil end&lt;br /&gt;
		local bcPatterns = {}&lt;br /&gt;
		table.insert(bcPatterns, &amp;#039;î%.e%.n%.?&amp;#039;)&lt;br /&gt;
		table.insert(bcPatterns, &amp;#039;î%.%s*Hr%.&amp;#039;)&lt;br /&gt;
		for _,eachBCPattern in ipairs(bcPatterns) do&lt;br /&gt;
			local eraMatchFunction = mw.ustring.gmatch(datetext, eachBCPattern)&lt;br /&gt;
			if eraMatchFunction then&lt;br /&gt;
				local eraMatch = eraMatchFunction()&lt;br /&gt;
				if eraMatch and eraMatch ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					if centNum &amp;gt; 0 then centNum = -centNum end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return centNum&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
p.parseYear = function(datetxt)&lt;br /&gt;
	if (not mw.ustring.gmatch(datetxt, &amp;#039;^[%d%sîd%.HrenADBC]+$&amp;#039;)) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local yearPattern = &amp;#039;%d+&amp;#039;&lt;br /&gt;
	local bcPatterns = {&amp;#039;î%.e%.n%.?&amp;#039;, &amp;#039;î%.%s*Hr%.&amp;#039;, &amp;#039;BC&amp;#039;}&lt;br /&gt;
	&lt;br /&gt;
	local yearMatchFunction = mw.ustring.gmatch(datetxt, yearPattern)&lt;br /&gt;
	if not yearMatchFunction then return nil end&lt;br /&gt;
	local d = {}&lt;br /&gt;
	local yearMatch = yearMatchFunction()&lt;br /&gt;
	if not yearMatch or yearMatch == &amp;#039;&amp;#039; then return nil end&lt;br /&gt;
	d.year = tonumber(yearMatch)&lt;br /&gt;
	d.precision = 9&lt;br /&gt;
	for _,eachBCPattern in ipairs(bcPatterns) do&lt;br /&gt;
		local eraMatchFunction = mw.ustring.gmatch(datetxt, eachBCPattern)&lt;br /&gt;
		if eraMatchFunction then&lt;br /&gt;
			local eraMatch = eraMatchFunction()&lt;br /&gt;
			if eraMatch and eraMatch ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				if d.year &amp;gt; 0 then d.year = -d.year end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return d&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.parseDate = function(datetxt)&lt;br /&gt;
	if not datetxt then return nil end&lt;br /&gt;
	&lt;br /&gt;
	local parsers = {}&lt;br /&gt;
	local stdDateParser = {&lt;br /&gt;
			pattern = &amp;#039;((%d%d%d%d)-(%d%d?)-(%d%d?))&amp;#039;,&lt;br /&gt;
			patternIsMatched = function(matchArray)&lt;br /&gt;
				return tonumber(matchArray[2]) &amp;lt; 13 and tonumber(matchArray[3]) &amp;lt; 32&lt;br /&gt;
			end,&lt;br /&gt;
			extractDateFromText = function(matchArray)&lt;br /&gt;
				local d = {}&lt;br /&gt;
				d.day = tonumber(matchArray[3])&lt;br /&gt;
				d.month = tonumber(matchArray[2])&lt;br /&gt;
				d.year = tonumber(matchArray[1])&lt;br /&gt;
				d.precision = 11&lt;br /&gt;
				return d&lt;br /&gt;
			end&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, stdDateParser)&lt;br /&gt;
	&lt;br /&gt;
	local noHyphensStdDateParser = {&lt;br /&gt;
		pattern = &amp;#039;((%d%d%d%d)(%d%d)(%d%d))&amp;#039;,&lt;br /&gt;
		patternIsMatched = stdDateParser.patternIsMatched,&lt;br /&gt;
		extractDateFromText = stdDateParser.extractDateFromText&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, noHyphensStdDateParser)&lt;br /&gt;
	&lt;br /&gt;
	local roDateParser = {&lt;br /&gt;
			pattern = &amp;#039;((%d+)%s+(%a+)%s+(%d+))&amp;#039;,&lt;br /&gt;
			patternIsMatched = function(matchArray)&lt;br /&gt;
				return matchArray[1] and mw.ustring.len(mw.text.trim(matchArray[1])) &amp;gt; 0 and matchArray[2] and months[matchArray[2]] ~= nil&lt;br /&gt;
			end,&lt;br /&gt;
			extractDateFromText = function(matchArray)&lt;br /&gt;
				local d = {}&lt;br /&gt;
				d.day = tonumber(matchArray[1])&lt;br /&gt;
				d.month = tonumber(months[matchArray[2]])&lt;br /&gt;
				d.year = tonumber(matchArray[3])&lt;br /&gt;
				d.precision = 11&lt;br /&gt;
				return d&lt;br /&gt;
			end&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, roDateParser)&lt;br /&gt;
&lt;br /&gt;
	local slashedDateParser = {&lt;br /&gt;
		pattern = &amp;#039;((%d%d)/(%d%d)/(%d%d%d%d))&amp;#039;,&lt;br /&gt;
		patternIsMatched = function(matchArray)&lt;br /&gt;
			return matchArray[1] and tonumber(matchArray[1]) &amp;lt; 32 and matchArray[2] and tonumber(matchArray[2]) &amp;lt; 13 &lt;br /&gt;
		end,&lt;br /&gt;
		extractDateFromText = function(matchArray)&lt;br /&gt;
				local d = {}&lt;br /&gt;
				d.day = tonumber(matchArray[1])&lt;br /&gt;
				d.month = tonumber(matchArray[2])&lt;br /&gt;
				d.year = tonumber(matchArray[3])&lt;br /&gt;
				d.precision = 11&lt;br /&gt;
				return d&lt;br /&gt;
			end&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, slashedDateParser)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	local enDateParser = {&lt;br /&gt;
			pattern = &amp;#039;((%a+)%s+(%d+),%s+(%d+))&amp;#039;,&lt;br /&gt;
			patternIsMatched = function(matchArray)&lt;br /&gt;
				return matchArray[2] and mw.ustring.len(mw.text.trim(matchArray[2])) &amp;gt; 0 and matchArray[1] and months[matchArray[1]] ~= nil&lt;br /&gt;
			end,&lt;br /&gt;
			extractDateFromText = function(matchArray)&lt;br /&gt;
				local d = {}&lt;br /&gt;
				d.day = tonumber(matchArray[2])&lt;br /&gt;
				d.month = tonumber(months[matchArray[1]])&lt;br /&gt;
				d.year = tonumber(matchArray[3])&lt;br /&gt;
				d.precision = 11&lt;br /&gt;
				return d&lt;br /&gt;
			end&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, enDateParser)&lt;br /&gt;
&lt;br /&gt;
	local monthOnlyParser = {	&lt;br /&gt;
			pattern = &amp;#039;((%a+)%s+(%d+))&amp;#039;,&lt;br /&gt;
			patternIsMatched = function(matchArray)&lt;br /&gt;
				return matchArray[1] and months[matchArray[1]] ~= nil&lt;br /&gt;
			end,&lt;br /&gt;
			extractDateFromText = function(matchArray)&lt;br /&gt;
				local d = {}&lt;br /&gt;
				d.month = tonumber(months[matchArray[1]])&lt;br /&gt;
				d.year = tonumber(matchArray[2])&lt;br /&gt;
				d.precision = 10&lt;br /&gt;
				return d&lt;br /&gt;
			end&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, monthOnlyParser)&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	local monthOnlyNumericParser = {	&lt;br /&gt;
			pattern = &amp;#039;((%d+)-(%d+))&amp;#039;,&lt;br /&gt;
			patternIsMatched = function(matchArray)&lt;br /&gt;
				return matchArray[1] and matchArray[2]&lt;br /&gt;
			end,&lt;br /&gt;
			extractDateFromText = function(matchArray)&lt;br /&gt;
				local d = {}&lt;br /&gt;
				d.month = tonumber(matchArray[2])&lt;br /&gt;
				d.year = tonumber(matchArray[1])&lt;br /&gt;
				d.precision = 10&lt;br /&gt;
				return d&lt;br /&gt;
			end&lt;br /&gt;
	}&lt;br /&gt;
	table.insert(parsers, monthOnlyNumericParser)&lt;br /&gt;
	&lt;br /&gt;
	for _,eachParser in ipairs(parsers) do&lt;br /&gt;
		local eachMatchSet = {mw.ustring.gmatch(datetxt, eachParser.pattern)()}&lt;br /&gt;
		if eachMatchSet[1] == datetxt then&lt;br /&gt;
			table.remove(eachMatchSet, 1)&lt;br /&gt;
			if eachParser.patternIsMatched(eachMatchSet) then&lt;br /&gt;
				local d = eachParser.extractDateFromText(eachMatchSet)&lt;br /&gt;
				if d ~= nil then&lt;br /&gt;
					return d&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local yr = p.parseYear(datetxt)&lt;br /&gt;
	if yr ~= nil then&lt;br /&gt;
		return yr&lt;br /&gt;
	end&lt;br /&gt;
	local cent = p.parseCentury(datetxt)&lt;br /&gt;
	if cent ~= nil then&lt;br /&gt;
		local d = {}&lt;br /&gt;
		d.year = tonumber(cent * 100)&lt;br /&gt;
		d.precision = 7&lt;br /&gt;
		return d&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.parseWikidataDate = function(datetxt, precision)&lt;br /&gt;
	if not datetxt then return nil end&lt;br /&gt;
	if precision == nil then precision = 11 end&lt;br /&gt;
	local iSOTimeSign = mw.ustring.sub(datetxt, 1, 1)&lt;br /&gt;
	local datePattern = &amp;#039;(%d+)-(%d+)-(%d+)&amp;#039;&lt;br /&gt;
	local matchesIterator = mw.ustring.gmatch(mw.ustring.sub(datetxt, 2), datePattern)&lt;br /&gt;
	local yearSign = 1&lt;br /&gt;
	--local timePattern = &amp;#039;(%d+):(%d+):(%d+)&amp;#039;&lt;br /&gt;
	--local matchestimeIterator = mw.ustring.gmatch(datetxt, timePattern)&lt;br /&gt;
	&lt;br /&gt;
	local yearStr, monthStr, dayStr = matchesIterator()&lt;br /&gt;
	if dayStr and tonumber(dayStr) == 0 then dayStr = &amp;quot;01&amp;quot; end&lt;br /&gt;
	if monthStr and tonumber(monthStr) == 0 then monthStr = &amp;quot;01&amp;quot; end&lt;br /&gt;
	if iSOTimeSign == &amp;quot;-&amp;quot; then yearSign = -1 end&lt;br /&gt;
&lt;br /&gt;
	if precision &amp;gt;= 11 and dayStr and monthStr and yearStr then&lt;br /&gt;
		local d = {}&lt;br /&gt;
		d.day = tonumber(dayStr)&lt;br /&gt;
		d.month = tonumber(monthStr)&lt;br /&gt;
		d.year = tonumber(yearStr) * yearSign&lt;br /&gt;
		d.precision = precision&lt;br /&gt;
		return d&lt;br /&gt;
	end&lt;br /&gt;
	if precision == 10 and monthStr and yearStr then&lt;br /&gt;
		local d = {}&lt;br /&gt;
		d.day = 1 --this is a &amp;quot;valid 0&amp;quot;&lt;br /&gt;
		d.month = tonumber(monthStr)&lt;br /&gt;
		d.year = tonumber(yearStr) * yearSign&lt;br /&gt;
		d.precision = precision&lt;br /&gt;
		return d&lt;br /&gt;
	end&lt;br /&gt;
	if precision &amp;lt;= 9 and yearStr then&lt;br /&gt;
		local d = {}&lt;br /&gt;
		d.day = 1 --this is a &amp;quot;valid 0&amp;quot;&lt;br /&gt;
		d.month = 1 --this is a &amp;quot;valid 0&amp;quot;&lt;br /&gt;
		d.year = tonumber(yearStr) * yearSign&lt;br /&gt;
		d.precision = precision&lt;br /&gt;
		return d&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.compare = function(d1, d2)&lt;br /&gt;
	if not d1.year and d2.year then return 1 end&lt;br /&gt;
	if not d2.year and d1.year then return -1 end&lt;br /&gt;
	if not d1.month and d2.month then&lt;br /&gt;
		if d1.year == d2.year then&lt;br /&gt;
			return 1&lt;br /&gt;
		else &lt;br /&gt;
			return d1.year - d2.year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not d2.month and d1.month then&lt;br /&gt;
		if d1.year == d2.year then&lt;br /&gt;
			return -1&lt;br /&gt;
		else &lt;br /&gt;
			return d1.year - d2.year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not d1.day and d2.day then &lt;br /&gt;
		if d1.year == d2.year then&lt;br /&gt;
			if d1.month == d2.month then&lt;br /&gt;
				return 1&lt;br /&gt;
			else &lt;br /&gt;
				return d1.month - d2.month&lt;br /&gt;
			end&lt;br /&gt;
		else &lt;br /&gt;
			return d1.year - d2.year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not d2.day and d1.day then&lt;br /&gt;
		if d1.year == d2.year then&lt;br /&gt;
			if d1.month == d2.month then&lt;br /&gt;
				return -1&lt;br /&gt;
			else &lt;br /&gt;
				return d1.month - d2.month&lt;br /&gt;
			end&lt;br /&gt;
		else &lt;br /&gt;
			return d1.year - d2.year&lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	if d1.year == d2.year then&lt;br /&gt;
		if d1.month == d2.month then&lt;br /&gt;
			if d1.day == d2.day then&lt;br /&gt;
				return 0&lt;br /&gt;
			else return (d1.day - d2.day) / math.abs(d1.day - d2.day)&lt;br /&gt;
			end&lt;br /&gt;
		else return (d1.month - d2.month) / math.abs(d1.month - d2.month)&lt;br /&gt;
		end&lt;br /&gt;
	else return (d1.year - d2.year) / math.abs(d1.year - d2.year)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.extractDateFromWikidataSnak = function(snak)&lt;br /&gt;
	if snak.snaktype ~= &amp;#039;value&amp;#039; or not snak.datavalue then return nil end&lt;br /&gt;
	local timestamp = snak.datavalue.value.time&lt;br /&gt;
	local precision = snak.datavalue.value.precision&lt;br /&gt;
	return p.parseWikidataDate(timestamp, precision)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.toISO8601 = function(s)&lt;br /&gt;
	if not s then return nil end&lt;br /&gt;
	local d = type(s) == &amp;#039;string&amp;#039; and p.parseDate(s) or s&lt;br /&gt;
	return mw.language.getContentLanguage():formatDate(&amp;#039;Y-m-d&amp;#039;, os.date(&amp;#039;%d %B %Y&amp;#039;, os.time(d)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.addDaysToDateFromFrame = function(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local days = args.delta and tonumber(args.delta) or 1&lt;br /&gt;
	local today&lt;br /&gt;
	if args.referenceDate then&lt;br /&gt;
		today = p.parseDate(args.referenceDate)&lt;br /&gt;
	else&lt;br /&gt;
		today = os.date(&amp;quot;*t&amp;quot;)&lt;br /&gt;
		today.precision = 11&lt;br /&gt;
	end&lt;br /&gt;
	local tomorrow = p.addDaysToDate(today, days)&lt;br /&gt;
	return p.formatDate(tomorrow, false, args.notimetag ~= nil, args.dateFormat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.daysBetween(d1, d2)&lt;br /&gt;
	if d1.precision &amp;lt; 10 then&lt;br /&gt;
		d1.month = 1&lt;br /&gt;
	end&lt;br /&gt;
	if d1.precision &amp;lt; 11 then&lt;br /&gt;
		d1.day = 1&lt;br /&gt;
	end&lt;br /&gt;
	if d2.precision &amp;lt; 10 then&lt;br /&gt;
		d2.month = 12&lt;br /&gt;
	end&lt;br /&gt;
	if d2.precision &amp;lt; 11 then&lt;br /&gt;
		d2.day = maxDaysInMonth[d1.month]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local time1 = os.time(d1)&lt;br /&gt;
	local time2 = os.time(d2)&lt;br /&gt;
	local secsdiff = os.difftime(time2, time1)&lt;br /&gt;
	return secsdiff / 3600 / 24&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sergiu</name></author>
	</entry>
</feed>