<?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%2FDeimos18%2FDates</id>
	<title>Module:Sandbox/Deimos18/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%2FDeimos18%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Deimos18/Dates&amp;action=history"/>
	<updated>2026-05-27T21:49:52Z</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/Deimos18/Dates&amp;diff=145323&amp;oldid=prev</id>
		<title>imported&gt;Deimos18 at 22:52, 13 November 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Deimos18/Dates&amp;diff=145323&amp;oldid=prev"/>
		<updated>2018-11-13T22:52:31Z</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;-- Deimos Google Code-in, Date formatting&lt;br /&gt;
&lt;br /&gt;
-- Plan of action:&lt;br /&gt;
-- Find type of string&lt;br /&gt;
-- Separate out day, month and year&lt;br /&gt;
-- Format date according to desired format&lt;br /&gt;
-- Add exceptions for February&lt;br /&gt;
-- Find and remove useless words which taint the text to find the required date&lt;br /&gt;
-- Find special words like &amp;quot;uncertain&amp;quot; and &amp;quot;around&amp;quot; to replace with &amp;quot;circa&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
months = {&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;} -- for iso-type dates&lt;br /&gt;
month_s = {&amp;quot;jan&amp;quot;, &amp;quot;feb&amp;quot;, &amp;quot;mar&amp;quot;, &amp;quot;apr&amp;quot;, &amp;quot;may&amp;quot;, &amp;quot;jun&amp;quot;, &amp;quot;jul&amp;quot;, &amp;quot;aug&amp;quot;, &amp;quot;sep&amp;quot;, &amp;quot;oct&amp;quot;, &amp;quot;nov&amp;quot;, &amp;quot;dec&amp;quot;} -- for 3-lettered month dates (it won&amp;#039;t get shorter than this, would it?)&lt;br /&gt;
circa = {&amp;quot;around&amp;quot;, &amp;quot;sometime around&amp;quot;, &amp;quot;uncertain&amp;quot;, &amp;quot;approximately&amp;quot;, &amp;quot;approx&amp;quot;, &amp;quot;about&amp;quot;, &amp;quot;probably&amp;quot;, &amp;quot;circa&amp;quot;}&lt;br /&gt;
eralist = {&amp;quot;ce&amp;quot;, &amp;quot;bc&amp;quot;, &amp;quot;bce&amp;quot;, &amp;quot;ad&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
function flUpper (str)&lt;br /&gt;
	local str = str or &amp;quot;&amp;quot;&lt;br /&gt;
	local l_check = string.match(str, &amp;quot;(%a+)&amp;quot;) -- To take the first letter-y part of the string out of the complete string (for editing, ofc)&lt;br /&gt;
	local str_fi, str_la = string.find(str, &amp;quot;(%a+)&amp;quot;) -- Find the first and last indices of the first letter-y part of string that appears&lt;br /&gt;
	if (str_fi == nil and l_check == nil) then -- checking if the string even consists letters&lt;br /&gt;
		out = str -- return back whatever there is since there&amp;#039;s no letter anyways&lt;br /&gt;
	else&lt;br /&gt;
		local str_bef = string.sub(str,1,(str_fi-1)) -- Obtaining the part of the string before the first letter&lt;br /&gt;
		local str_fl = string.sub(l_check,1,1) -- Getting the first letter&lt;br /&gt;
		local str_cap = string.upper(str_fl) -- Capitalizing the first letter&lt;br /&gt;
		local str_end = string.sub(str, str_fi+1) -- Obtaining the rear part of the string i.e. the part after the first letter&lt;br /&gt;
		out = str_bef .. str_cap .. str_end -- Joining together the front, capitalized and rear part to return the complete string&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addCirca = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
function findType (str) -- To check if data type is other than mdy&lt;br /&gt;
	str = str or &amp;quot;&amp;quot;&lt;br /&gt;
	dateType = &amp;quot;&amp;quot;&lt;br /&gt;
	local fts = &amp;quot;&amp;quot;&lt;br /&gt;
	local fte = &amp;quot;&amp;quot;&lt;br /&gt;
	fts, fte = string.find(str, &amp;quot;(%d+)-(%d+)-(%d+)&amp;quot;)&lt;br /&gt;
	if (fts ~= nil) then&lt;br /&gt;
		dateType = &amp;quot;iso&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	fts, fte = string.find(str, &amp;quot;(%d+)/(%d+)/(%d+)&amp;quot;)&lt;br /&gt;
	if (fts ~= nil) then&lt;br /&gt;
		dateType = &amp;quot;slashed&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	for n=1,#circa do&lt;br /&gt;
		findCirca = string.match(str, circa[n])&lt;br /&gt;
		if (findCirca ~= nil) then&lt;br /&gt;
			addCirca = &amp;quot;circa &amp;quot;&lt;br /&gt;
			break&lt;br /&gt;
		else&lt;br /&gt;
			addCirca = &amp;quot;&amp;quot;&lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
	if (dateType == nil) then dateType = &amp;quot;dmy&amp;quot; end&lt;br /&gt;
	return dateType&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isoDates (str)&lt;br /&gt;
	local yeari, monthnum, dayi = string.match(str, &amp;quot;(%d%d%d%d)-(%d%d)-(%d%d)&amp;quot;)&lt;br /&gt;
	local monthi = flUpper(months[tonumber(monthnum)])&lt;br /&gt;
	return dayi, monthi, yeari&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function slashedDates (str)&lt;br /&gt;
	local days, monthnum, years = string.match(str, &amp;quot;(%d%d)/(%d%d)/(%d%d%d%d)&amp;quot;)&lt;br /&gt;
	local monthsl = flUpper(months[tonumber(monthnum)])&lt;br /&gt;
	return days, monthsl, years&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function findEra (str)&lt;br /&gt;
	str = str or &amp;quot;&amp;quot;&lt;br /&gt;
	local era = &amp;quot;&amp;quot;&lt;br /&gt;
	for q=1,#eralist do&lt;br /&gt;
		era = string.match(str, &amp;quot;(%s+)&amp;quot; .. eralist[q])&lt;br /&gt;
		if (era ~= nil) then&lt;br /&gt;
			era = string.upper(eralist[q])&lt;br /&gt;
			break&lt;br /&gt;
		else &lt;br /&gt;
			era = &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return era&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function findFebruary (day, month, year)&lt;br /&gt;
	local day = tonumber(day) or &amp;quot;&amp;quot;&lt;br /&gt;
	local month = month or &amp;quot;&amp;quot;&lt;br /&gt;
	local year = tonumber(year) or &amp;quot;&amp;quot;&lt;br /&gt;
	local nofeb = &amp;quot;nofeb&amp;quot;&lt;br /&gt;
	if (month == &amp;quot;February&amp;quot;) then&lt;br /&gt;
		if ((year%4)==0) then&lt;br /&gt;
			if (day &amp;gt; 29) then&lt;br /&gt;
				return false&lt;br /&gt;
			else&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if (day &amp;gt; 28) then&lt;br /&gt;
				return false&lt;br /&gt;
			else&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return nofeb&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function findIfNumberExists (str)&lt;br /&gt;
	str = str or &amp;quot;&amp;quot;&lt;br /&gt;
	local check = string.match(str, &amp;quot;(%d+)&amp;quot;)&lt;br /&gt;
	if (check ~= nil) then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function changeFormat (day, month, year, addCirca, era, dtype, format)&lt;br /&gt;
	if (dtype == &amp;quot;slashed&amp;quot; and (format == nil or format == &amp;quot;&amp;quot;)) then format = &amp;quot;iso&amp;quot; end&lt;br /&gt;
	if (dtype == &amp;quot;iso&amp;quot; and (format == nil or format == &amp;quot;&amp;quot;)) then format = &amp;quot;iso&amp;quot; end&lt;br /&gt;
	local format = format or &amp;quot;dmy&amp;quot;&lt;br /&gt;
	local form = &amp;quot;&amp;quot;&lt;br /&gt;
	local era = era or &amp;quot;&amp;quot;&lt;br /&gt;
	if (addCirca == &amp;quot;&amp;quot; or addCirca == nil) then addCirca = &amp;quot;&amp;quot; end&lt;br /&gt;
	if (format == &amp;quot;mdy&amp;quot;) then&lt;br /&gt;
		form = addCirca .. month .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year&lt;br /&gt;
	end&lt;br /&gt;
	if (format == &amp;quot;iso&amp;quot;) then&lt;br /&gt;
		for e=1,#months do&lt;br /&gt;
			local monthfind = string.match(string.lower(month), months[e])&lt;br /&gt;
			if (monthfind ~= nil) then&lt;br /&gt;
				monthnumi = e&lt;br /&gt;
				if (string.match(monthnumi, &amp;quot;[0-9][0-9]&amp;quot;) == nil) then monthnumi = &amp;quot;0&amp;quot; .. monthnumi end&lt;br /&gt;
				break &lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if (month == nil or month == &amp;quot;&amp;quot; or monthnumi == nil or monthnumi == &amp;quot;&amp;quot;) then&lt;br /&gt;
			form = &amp;quot;Invalid Entry&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			form = addCirca .. year .. &amp;quot;-&amp;quot; .. monthnumi .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (format == &amp;quot;dmy&amp;quot;) then&lt;br /&gt;
		form = addCirca .. day .. &amp;quot; &amp;quot; .. month .. &amp;quot; &amp;quot; .. year .. &amp;quot; &amp;quot; .. era&lt;br /&gt;
	end&lt;br /&gt;
	if (format == &amp;quot;year&amp;quot;) then&lt;br /&gt;
		form = addCirca .. year .. &amp;quot; &amp;quot; .. era&lt;br /&gt;
	end&lt;br /&gt;
	if (format == &amp;quot;month and year&amp;quot;) then&lt;br /&gt;
		form = addCirca .. month .. &amp;quot; &amp;quot; .. year .. &amp;quot; &amp;quot; .. era&lt;br /&gt;
	end&lt;br /&gt;
	return form&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.formatDate = function (frame)&lt;br /&gt;
	local text = string.lower(frame.args.text)&lt;br /&gt;
	local format = frame.args.format&lt;br /&gt;
	dtype = findType(text)&lt;br /&gt;
	invEnt = false&lt;br /&gt;
	eras = findEra(text) or &amp;quot;&amp;quot;&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	ms = &amp;quot;&amp;quot;&lt;br /&gt;
	me = &amp;quot;&amp;quot;&lt;br /&gt;
	mst = false&lt;br /&gt;
	local msn = &amp;quot;&amp;quot;&lt;br /&gt;
	for i=1,#months do&lt;br /&gt;
		ms, me = string.find(text,months[i])&lt;br /&gt;
		if (ms ~= nil) then break end&lt;br /&gt;
	end&lt;br /&gt;
	if (ms == nil) then&lt;br /&gt;
		for i=1,#month_s do&lt;br /&gt;
			ms, me = string.find(text,month_s[i])&lt;br /&gt;
			if (ms ~= nil) then&lt;br /&gt;
				msn = i&lt;br /&gt;
				mst = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (ms ~= nil) then&lt;br /&gt;
		if (mst==true) then&lt;br /&gt;
			month = flUpper(months[msn])&lt;br /&gt;
		else&lt;br /&gt;
			month = flUpper(string.sub(text, ms, me))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		month = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local year = string.match(text, &amp;quot;%d%d%d%d&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
	if (year == &amp;quot;&amp;quot;) then&lt;br /&gt;
		year = string.match(text, &amp;quot;%d%d%d&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
		if (year == &amp;quot;&amp;quot; and (eras == nil or eras == &amp;quot;&amp;quot;)) then&lt;br /&gt;
			year = string.match(text, &amp;quot;%d%d% %a+ (%d%d)&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if (year == &amp;quot;&amp;quot; and eras ~= nil and eras ~= &amp;quot;&amp;quot;) then&lt;br /&gt;
			year = string.match(text, &amp;quot;(%d%d) &amp;quot; .. string.lower(eras)) or &amp;quot;&amp;quot;&lt;br /&gt;
			if (year == &amp;quot;&amp;quot; and eras ~= nil and eras ~= &amp;quot;&amp;quot;) then&lt;br /&gt;
				year = string.match(text, &amp;quot;(%d) &amp;quot; .. string.lower(eras)) or &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local leftOutString = string.gsub(text, year, &amp;quot;none&amp;quot;, 1)&lt;br /&gt;
	if (month == &amp;quot;&amp;quot; and year ~= &amp;quot;&amp;quot;) then&lt;br /&gt;
		day = &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		day = string.match(leftOutString, &amp;quot;(%d+)&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if (dtype == &amp;quot;iso&amp;quot;) then day, month, year = isoDates(text) end&lt;br /&gt;
	if (dtype == &amp;quot;slashed&amp;quot;) then day, month, year = slashedDates(text) end&lt;br /&gt;
	if (findIfNumberExists(text)==false) then&lt;br /&gt;
		invEnt = true&lt;br /&gt;
		day = &amp;quot;1&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	out = out .. changeFormat(day, month, year, addCirca, eras, dtype, format)&lt;br /&gt;
	febCheck = findFebruary(day,month,year)&lt;br /&gt;
	if (febCheck ~= &amp;quot;nofeb&amp;quot; and febCheck==false) then invEnt = true end&lt;br /&gt;
	if ((febCheck == &amp;quot;nofeb&amp;quot;) and day ~= &amp;quot;&amp;quot; and (tonumber(day) &amp;gt; 31) and (tonumber(day) &amp;lt; 1)) then invEnt = true end&lt;br /&gt;
	if (invEnt == true) then out = &amp;quot;Invalid Entry&amp;quot; end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Deimos18</name></author>
	</entry>
</feed>