<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FBoboquack%2FDates</id>
	<title>Module:Sandbox/Boboquack/Dates - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FBoboquack%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Boboquack/Dates&amp;action=history"/>
	<updated>2026-05-27T11:22:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Boboquack/Dates&amp;diff=145203&amp;oldid=prev</id>
		<title>imported&gt;Boboquack at 09:47, 7 November 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Boboquack/Dates&amp;diff=145203&amp;oldid=prev"/>
		<updated>2018-11-07T09:47:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- For Google Code In 2018 - Lua Task 7 - Date formatting&lt;br /&gt;
&lt;br /&gt;
local p={}&lt;br /&gt;
&lt;br /&gt;
p.valid=function(day,month,year)&lt;br /&gt;
	day,month,year=tonumber(day),tonumber(month),tonumber(year)&lt;br /&gt;
	local lengths={31,0,31,30,31,30,31,31,30,31,30,31}&lt;br /&gt;
	local long=0&lt;br /&gt;
	if year==nil then return false end&lt;br /&gt;
	if type(year)~=&amp;#039;number&amp;#039; or math.floor(year)~=year or year&amp;lt;1 then return false end&lt;br /&gt;
	if month==nil then return true end&lt;br /&gt;
	if type(month)~=&amp;#039;number&amp;#039; or math.floor(month)~=month or month&amp;lt;1 or month&amp;gt;12 then return false end&lt;br /&gt;
	if day==nil then return true end&lt;br /&gt;
	if type(day)~=&amp;#039;number&amp;#039; or math.floor(day)~=day or day&amp;lt;1 then return false end&lt;br /&gt;
	if month==2 then&lt;br /&gt;
		if year%400==0 then long=29 &lt;br /&gt;
		elseif year%100==0 then long=28&lt;br /&gt;
		elseif year%4==0 then long=29&lt;br /&gt;
		else long=28 end&lt;br /&gt;
	else&lt;br /&gt;
		long=lengths[month]&lt;br /&gt;
	end&lt;br /&gt;
	return day&amp;lt;=long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.testvalid=function(frame)&lt;br /&gt;
	return p.valid(frame.args.day,frame.args.month,frame.args.year)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.convert=function(frame)&lt;br /&gt;
	local indate=frame.args.date&lt;br /&gt;
	local day,month,year,era,inform,circa,outdate=nil&lt;br /&gt;
	local monthregex={&amp;quot;[Jj]an&amp;quot;,&amp;quot;[Ff]eb&amp;quot;,&amp;quot;[Mm]ar&amp;quot;,&amp;quot;[Aa]pr&amp;quot;,&amp;quot;[Mm]ay&amp;quot;,&amp;quot;[Jj]un&amp;quot;,&amp;quot;[Jj]ul&amp;quot;,&amp;quot;[Aa]ug&amp;quot;,&amp;quot;[Ss]ep&amp;quot;,&amp;quot;[Oo]ct&amp;quot;,&amp;quot;[Nn]ov&amp;quot;,&amp;quot;[Dd]ec&amp;quot;}&lt;br /&gt;
	local monthnames={&amp;quot;January &amp;quot;,&amp;quot;February &amp;quot;,&amp;quot;March &amp;quot;,&amp;quot;April &amp;quot;,&amp;quot;May &amp;quot;,&amp;quot;June &amp;quot;,&amp;quot;July &amp;quot;,&amp;quot;August &amp;quot;,&amp;quot;September &amp;quot;,&amp;quot;October &amp;quot;,&amp;quot;November &amp;quot;,&amp;quot;December &amp;quot;}&lt;br /&gt;
	&lt;br /&gt;
	--parse indate -&amp;gt; inform, day, month, year; then check if valid&lt;br /&gt;
	--first try: parse as some iso-like format&lt;br /&gt;
	local num1,num2,num3,era=string.match(indate,&amp;quot;(%d+)%D+(%d+)%D+(%d+)&amp;quot;)&lt;br /&gt;
	if p.valid(num3,num2,num1) then day,month,year,inform=num3,num2,num1,&amp;quot;iso&amp;quot; else&lt;br /&gt;
	if p.valid(num1,num2,num3) then day,month,year,inform=num1,num2,num3,&amp;quot;iso&amp;quot; else&lt;br /&gt;
	if p.valid(num2,num1,num3) then day,month,year,inform=num2,num1,num3,&amp;quot;iso&amp;quot; else&lt;br /&gt;
	if p.valid(num3,num1,num2) then day,month,year,inform=num3,num1,num2,&amp;quot;iso&amp;quot; else&lt;br /&gt;
	if p.valid(num1,num3,num2) then day,month,year,inform=num1,num3,num2,&amp;quot;iso&amp;quot; else&lt;br /&gt;
	if p.valid(num2,num3,num1) then day,month,year,inform=num2,num3,num1,&amp;quot;iso&amp;quot; else&lt;br /&gt;
	if num1~=nil and num2~=nil and num3~=nil then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--second try: parse as some dmy-like format&lt;br /&gt;
	local num4,num5,mon1=nil&lt;br /&gt;
	for i=1,12 do&lt;br /&gt;
		num4,num5=string.match(indate,&amp;quot;(%d+)%D+&amp;quot;..monthregex[i]..&amp;quot;%D+(%d+)&amp;quot;)&lt;br /&gt;
		if num4~=nil then &lt;br /&gt;
			mon1=i&lt;br /&gt;
			break &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if p.valid(num4,mon1,num5) then day,month,year,inform=num4,mon1,num5,&amp;quot;dmy&amp;quot; else&lt;br /&gt;
	if p.valid(num5,mon1,num4) then day,month,year,inform=num5,mon1,num4,&amp;quot;dmy&amp;quot; else&lt;br /&gt;
	if num4~=nil and mon1~=nil and num5~=nil then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--third try: parse as some mdy-like format&lt;br /&gt;
	local num6,num7,mon2=nil&lt;br /&gt;
	for i=1,12 do&lt;br /&gt;
		num6,num7=string.match(indate,monthregex[i]..&amp;quot;%D+(%d+)%D+(%d+)&amp;quot;)&lt;br /&gt;
		if num6~=nil then &lt;br /&gt;
			mon2=i&lt;br /&gt;
			break &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if p.valid(num6,mon2,num7) then day,month,year,inform=num6,mon2,num7,&amp;quot;mdy&amp;quot; else&lt;br /&gt;
	if p.valid(num7,mon2,num6) then day,month,year,inform=num7,mon2,num6,&amp;quot;mdy&amp;quot; else&lt;br /&gt;
	if num6~=nil and mon2~=nil and num7~=nil then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--fourth try: parse as month,year-like format&lt;br /&gt;
	local num8,mon3=nil&lt;br /&gt;
	for i=1,12 do&lt;br /&gt;
		num8=string.match(indate,monthregex[i]..&amp;quot;%D+(%d+)&amp;quot;)&lt;br /&gt;
		if num8~=nil then &lt;br /&gt;
			mon3=i&lt;br /&gt;
			break &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if p.valid(nil,mon3,num8) then month,year,inform=mon3,num8,&amp;quot;month and year&amp;quot; else&lt;br /&gt;
	if mon3~=nil and num8~=nil then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--(the unmentioned case: day and month)&lt;br /&gt;
	local num9,mon4=nil&lt;br /&gt;
	for i=1,12 do&lt;br /&gt;
		num9=string.match(indate,&amp;quot;(%d+)%D+&amp;quot;..monthregex[i])&lt;br /&gt;
		if num9~=nil then &lt;br /&gt;
			mon4=i&lt;br /&gt;
			break &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if mon4~=nil and p.valid(num9,mon4,2016) then day,month,inform=num9,mon4,&amp;quot;day and month&amp;quot; else&lt;br /&gt;
	if p.valid(nil,mon4,num9) then month,year,inform=mon4,num9,&amp;quot;month and year&amp;quot; else&lt;br /&gt;
	if mon4~=nil and num9~=nil then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--fifth try: parse as year&lt;br /&gt;
	if string.match(indate,&amp;quot;(%d+)%D*[^% %d]%D*(%d+)&amp;quot;) then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	local num0=string.match(&amp;quot;A&amp;quot;..indate,&amp;quot;.*%D(%d+)&amp;quot;)&lt;br /&gt;
	if p.valid(nil,nil,num0) then year,inform=num0,&amp;quot;year&amp;quot; else&lt;br /&gt;
	return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
	end end end end end end end end end end end end end end -- ends from all the elses&lt;br /&gt;
	&lt;br /&gt;
	--get era&lt;br /&gt;
	if string.find(indate,&amp;quot;BCE&amp;quot;) then era=&amp;quot; BCE&amp;quot;&lt;br /&gt;
	elseif string.find(indate,&amp;quot;BC&amp;quot;) then era=&amp;quot; BC&amp;quot;&lt;br /&gt;
	elseif string.find(indate,&amp;quot;CE&amp;quot;) then era=&amp;quot; CE&amp;quot;&lt;br /&gt;
	elseif string.find(indate,&amp;quot;AD&amp;quot;) then era=&amp;quot; AD&amp;quot;&lt;br /&gt;
	else era=&amp;quot;&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--get uncertainty&lt;br /&gt;
	if string.match(indate,&amp;quot;around&amp;quot;) then circa=&amp;quot;circa &amp;quot;&lt;br /&gt;
	elseif string.match(indate,&amp;quot;uncertain&amp;quot;) then circa=&amp;quot;circa &amp;quot; &lt;br /&gt;
	elseif string.match(indate,&amp;quot;about&amp;quot;) then circa=&amp;quot;circa &amp;quot; &lt;br /&gt;
	elseif string.match(indate,&amp;quot;approx&amp;quot;) then circa=&amp;quot;circa &amp;quot;&lt;br /&gt;
	elseif string.match(indate,&amp;quot;circa&amp;quot;) then circa=&amp;quot;circa &amp;quot;&lt;br /&gt;
	elseif string.match(indate,&amp;quot;ca%.&amp;quot;) then circa=&amp;quot;circa &amp;quot; &lt;br /&gt;
	else circa=&amp;quot;&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	--convert output date to input format -&amp;gt; outdate&lt;br /&gt;
	local outform=frame.args.format or inform&lt;br /&gt;
	day,month,year=tonumber(day),tonumber(month),tonumber(year)&lt;br /&gt;
	outdate = &amp;quot;&amp;quot;&lt;br /&gt;
	if outform==&amp;quot;iso&amp;quot; then&lt;br /&gt;
		if era==&amp;quot; BC&amp;quot; or era==&amp;quot; BCE&amp;quot; then&lt;br /&gt;
			circa=circa..&amp;quot;-&amp;quot;&lt;br /&gt;
			year=year-1&lt;br /&gt;
		end&lt;br /&gt;
		outdate = string.format(&amp;quot;%04d-%02d-%02d&amp;quot;,year,month,day)&lt;br /&gt;
	end&lt;br /&gt;
	if outform==&amp;quot;dmy&amp;quot; then&lt;br /&gt;
		outdate = day..&amp;quot; &amp;quot;..monthnames[month]..year..era&lt;br /&gt;
	end&lt;br /&gt;
	if outform==&amp;quot;mdy&amp;quot; then&lt;br /&gt;
		outdate = monthnames[month]..day..&amp;quot;, &amp;quot;..year..era&lt;br /&gt;
	end&lt;br /&gt;
	if outform==&amp;quot;month and year&amp;quot; then&lt;br /&gt;
		outdate = monthnames[month]..year..era&lt;br /&gt;
	end&lt;br /&gt;
	if outform==&amp;quot;day and month&amp;quot; then&lt;br /&gt;
		outdate = day..&amp;quot; &amp;quot;..monthnames[month]&lt;br /&gt;
	end&lt;br /&gt;
	if outform==&amp;quot;year&amp;quot; then&lt;br /&gt;
		outdate = year..era&lt;br /&gt;
	end&lt;br /&gt;
	outdate = circa..outdate&lt;br /&gt;
	return outdate&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Boboquack</name></author>
	</entry>
</feed>