<?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%2FNathan_fraignt%2FDates</id>
	<title>Module:Sandbox/Nathan fraignt/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%2FNathan_fraignt%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Nathan_fraignt/Dates&amp;action=history"/>
	<updated>2026-05-28T20:11:32Z</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/Nathan_fraignt/Dates&amp;diff=145895&amp;oldid=prev</id>
		<title>imported&gt;Nathan fraignt at 11:11, 10 November 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Nathan_fraignt/Dates&amp;diff=145895&amp;oldid=prev"/>
		<updated>2018-11-10T11:11:35Z</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;local table_contains = function (table, element)&lt;br /&gt;
  for _, value in pairs(table) do&lt;br /&gt;
    if value == element then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p = {}&lt;br /&gt;
local weird_years = {&amp;quot;AD&amp;quot;, &amp;quot;BCE&amp;quot;, &amp;quot;BC&amp;quot;}&lt;br /&gt;
local circa_words = {&amp;quot;around&amp;quot;, &amp;quot;sometime&amp;quot;, &amp;quot;uncertain&amp;quot;, &amp;quot;circa&amp;quot;, &amp;quot;ca&amp;quot;}&lt;br /&gt;
local 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;, &lt;br /&gt;
			&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;
local months_uppercase = {&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;, &lt;br /&gt;
			&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;
local months_abr = {}&lt;br /&gt;
for _, month in pairs(months) do&lt;br /&gt;
	table.insert(months_abr, string.sub(month, 1, 3))&lt;br /&gt;
end&lt;br /&gt;
local months_index={}&lt;br /&gt;
local months_abr_index={}&lt;br /&gt;
for k,v in pairs(months) do&lt;br /&gt;
   months_index[v]=k&lt;br /&gt;
end&lt;br /&gt;
for k,v in pairs(months_abr) do&lt;br /&gt;
   months_abr_index[v]=k&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local getDateType = function(date)&lt;br /&gt;
	nf_date = date&lt;br /&gt;
	if nf_date == nil then return nil end&lt;br /&gt;
	local isDMY = ((string.match(nf_date, &amp;quot;[0-3]?%d.*%s%a+%s%d%d%d+&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	local isMDY = ((string.match(nf_date, &amp;quot;%a+.[0-3]?%d.+%d%d%d+&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	if isDMY or isMDY then&lt;br /&gt;
		local foundMonth = false&lt;br /&gt;
		for word in string.gmatch(nf_date, &amp;quot;%w+&amp;quot;) do&lt;br /&gt;
			if months_abr_index[word:sub(1,3):lower()] then&lt;br /&gt;
				foundMonth = true&lt;br /&gt;
			end	&lt;br /&gt;
		end&lt;br /&gt;
		if foundMonth then isDMY, isMDY = isDMY, isMDY else isDMY, isMDY = false, false end&lt;br /&gt;
	end&lt;br /&gt;
	local isNumDMY = ((string.match(nf_date, &amp;quot;[0-3]?%d.[0-1]?%d.%d%d%d+&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	local isNumMDY = ((string.match(nf_date, &amp;quot;[0-1]?%d.[0-3]?%d.%d%d%d+&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	local isISO = ((string.match(nf_date, &amp;quot;%d%d%d%d.[0-1]?%d.[0-3]?%d&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	local isYear = ((string.match(nf_date, &amp;quot;%d%d%d+&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	local isMonthYear = false&lt;br /&gt;
	if isYear then&lt;br /&gt;
		local foundMonth = false&lt;br /&gt;
		for word in string.gmatch(nf_date, &amp;quot;%w+&amp;quot;) do&lt;br /&gt;
			if months_abr_index[word:sub(1,3):lower()] then&lt;br /&gt;
				foundMonth = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		isMonthYear = foundMonth&lt;br /&gt;
		isYear = not foundMonth&lt;br /&gt;
	end	&lt;br /&gt;
	local isDayMonth = ((string.match(nf_date, &amp;quot;[0-3]?%d%s%a&amp;quot;) ~= nil) and true or false)&lt;br /&gt;
	if isDayMonth then&lt;br /&gt;
		local foundMonth = false&lt;br /&gt;
		for word in string.gmatch(nf_date, &amp;quot;%w+&amp;quot;) do&lt;br /&gt;
			if months_abr_index[word:sub(1,3):lower()] then&lt;br /&gt;
				foundMonth = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		isDayMonth = foundMonth&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	if isDMY then return &amp;quot;DMY&amp;quot; end&lt;br /&gt;
	if isMDY then return &amp;quot;MDY&amp;quot; end&lt;br /&gt;
	if isNumDMY then return &amp;quot;NDMY&amp;quot; end&lt;br /&gt;
	if isNumMDY then return &amp;quot;NMDY&amp;quot; end&lt;br /&gt;
	if isISO then return &amp;quot;ISO&amp;quot; end&lt;br /&gt;
	if isYear then return &amp;quot;YEAR&amp;quot; end&lt;br /&gt;
	if isMonthYear then return &amp;quot;MY&amp;quot; end&lt;br /&gt;
	if isDayMonth then return &amp;quot;DM&amp;quot; end&lt;br /&gt;
	&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
p.getDate = function(frame)&lt;br /&gt;
	local dateToISO = function(nf_date, format)&lt;br /&gt;
			local day, month, year&lt;br /&gt;
			if format == &amp;quot;DMY&amp;quot; then&lt;br /&gt;
				local monthName, monthName_abr&lt;br /&gt;
				day, monthName, year = string.match(nf_date, &amp;quot;(%d+) (%w+) (%d%d%d+)&amp;quot;)&lt;br /&gt;
				if monthName == nil then monthName = &amp;quot;&amp;quot; end&lt;br /&gt;
				month = months_abr_index[string.lower(monthName)] or months_index[string.lower(monthName)]&lt;br /&gt;
				-- returns if format was something like 15 Jan 2013&lt;br /&gt;
				if month ~= nil then return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day end&lt;br /&gt;
				day = string.match(nf_date, &amp;quot;(%d%d?)&amp;quot;)&lt;br /&gt;
				year = string.match(nf_date, &amp;quot;(%d%d%d+)&amp;quot;)&lt;br /&gt;
				for _, mon in pairs(months_abr) do&lt;br /&gt;
					monthName_abr = string.match(string.lower(nf_date), mon)&lt;br /&gt;
					if monthName_abr ~= nil then break end&lt;br /&gt;
				end&lt;br /&gt;
				month = months_abr_index[monthName_abr]&lt;br /&gt;
				return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
			elseif format == &amp;quot;NDMY&amp;quot; then&lt;br /&gt;
				day, month, year = string.match(nf_date, &amp;quot;(%d%d?).(%d%d?).(%d%d%d+)&amp;quot;)&lt;br /&gt;
				return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
			elseif format == &amp;quot;MDY&amp;quot; then&lt;br /&gt;
				local monthName, monthName_abr&lt;br /&gt;
				monthName, day, year = string.match(nf_date, &amp;quot;(%w+) (%d+) (%d%d%d+)&amp;quot;)&lt;br /&gt;
				if monthName == nil then monthName = &amp;quot;&amp;quot; end&lt;br /&gt;
				month = months_abr_index[string.lower(monthName)] or months_index[string.lower(monthName)]&lt;br /&gt;
				if month ~= nil then return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day end&lt;br /&gt;
				day = string.match(nf_date, &amp;quot;(%d%d?)&amp;quot;)&lt;br /&gt;
				year = string.match(nf_date, &amp;quot;(%d%d%d+)&amp;quot;)&lt;br /&gt;
				for _, mon in pairs(months_abr) do&lt;br /&gt;
					monthName_abr = string.match(string.lower(nf_date), mon)&lt;br /&gt;
					if monthName_abr ~= nil then break end&lt;br /&gt;
				end&lt;br /&gt;
				month = months_abr_index[monthName_abr]&lt;br /&gt;
				return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
			elseif format == &amp;quot;NMDY&amp;quot; then&lt;br /&gt;
				month, day, year = string.match(nf_date, &amp;quot;(%d%d?).(%d%d?).(%d%d%d+)&amp;quot;)&lt;br /&gt;
				return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
			elseif format == &amp;quot;ISO&amp;quot; then&lt;br /&gt;
				year, month, day = string.match(nf_date, &amp;quot;(%d%d%d+).(%d%d?).(%d%d?)&amp;quot;)&lt;br /&gt;
				return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
			elseif format == &amp;quot;YEAR&amp;quot; then&lt;br /&gt;
				year = string.match(nf_date, &amp;quot;(%d%d%d+)&amp;quot;)&lt;br /&gt;
				return year&lt;br /&gt;
			elseif format == &amp;quot;MY&amp;quot; then&lt;br /&gt;
				year = string.match(nf_date, &amp;quot;(%d%d%d+)&amp;quot;)&lt;br /&gt;
				for _, mon in pairs(months_abr) do&lt;br /&gt;
					monthName_abr = string.match(string.lower(nf_date), mon)&lt;br /&gt;
					if monthName_abr ~= nil then break end&lt;br /&gt;
				end&lt;br /&gt;
				month = months_abr_index[monthName_abr]&lt;br /&gt;
				return year .. &amp;quot;-&amp;quot; .. month&lt;br /&gt;
			elseif format == &amp;quot;DM&amp;quot; then&lt;br /&gt;
				day = string.match(nf_date, &amp;quot;(%d%d?)&amp;quot;)&lt;br /&gt;
				for _, mon in pairs(months_abr) do&lt;br /&gt;
					monthName_abr = string.match(string.lower(nf_date), mon)&lt;br /&gt;
					if monthName_abr ~= nil then break end&lt;br /&gt;
				end&lt;br /&gt;
				month = months_abr_index[monthName_abr]&lt;br /&gt;
				return month .. &amp;quot;-&amp;quot; .. day&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	local isoToFormat = function(iso_date, formatTo)&lt;br /&gt;
		local format, monthName&lt;br /&gt;
		local toDMY = {&amp;quot;DMY&amp;quot;, &amp;quot;NDMY&amp;quot;}&lt;br /&gt;
		local toMDY = {&amp;quot;MDY&amp;quot;, &amp;quot;NMDY&amp;quot;} &lt;br /&gt;
		if table_contains(toDMY, formatTo) then format = &amp;quot;DMY&amp;quot;&lt;br /&gt;
		elseif table_contains(toMDY, formatTo) then format = &amp;quot;MDY&amp;quot; &lt;br /&gt;
		else format = formatTo end&lt;br /&gt;
		local year, month, day = string.match(iso_date, &amp;quot;(%d+).(%d+).(%d+)&amp;quot;) &lt;br /&gt;
		if format == &amp;quot;DMY&amp;quot; then&lt;br /&gt;
			monthName = months_uppercase[tonumber(month)]&lt;br /&gt;
			return day .. &amp;quot; &amp;quot; .. monthName .. &amp;quot; &amp;quot; .. year&lt;br /&gt;
		elseif format == &amp;quot;MDY&amp;quot; then&lt;br /&gt;
			monthName = months_uppercase[tonumber(month)]&lt;br /&gt;
			return monthName .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year&lt;br /&gt;
		elseif format == &amp;quot;ISO&amp;quot; then&lt;br /&gt;
			return iso_date&lt;br /&gt;
		elseif format == &amp;quot;YEAR&amp;quot; then&lt;br /&gt;
			return iso_date&lt;br /&gt;
		elseif format == &amp;quot;MY&amp;quot; then&lt;br /&gt;
			year, month = string.match(iso_date, &amp;quot;(%d+).(%d+)&amp;quot;) &lt;br /&gt;
			monthName = months_uppercase[tonumber(month)]&lt;br /&gt;
			return monthName .. &amp;quot; &amp;quot; .. year&lt;br /&gt;
		elseif format == &amp;quot;DM&amp;quot; then&lt;br /&gt;
			month, day = string.match(iso_date, &amp;quot;(%d+).(%d+)&amp;quot;) &lt;br /&gt;
			monthName = months_uppercase[tonumber(month)]&lt;br /&gt;
			return day .. &amp;quot; &amp;quot; .. monthName&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local addQuirks = function(f_date, nf_date, dateType)&lt;br /&gt;
		local yearPart, useCirca&lt;br /&gt;
		if dateType ~= &amp;quot;DM&amp;quot; then&lt;br /&gt;
			for _, weirdYear in pairs(weird_years) do&lt;br /&gt;
				if string.match(nf_date, weirdYear) ~= nil then&lt;br /&gt;
					yearPart = weirdYear&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for _, circaWord in pairs(circa_words) do&lt;br /&gt;
			if string.match(string.lower(nf_date), circaWord) ~= nil then&lt;br /&gt;
				useCirca = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local returnValue = f_date&lt;br /&gt;
		if yearPart ~= nil then returnValue = returnValue .. &amp;quot; &amp;quot; .. yearPart end&lt;br /&gt;
		if useCirca ~= nil then returnValue = &amp;quot;circa &amp;quot; .. returnValue end&lt;br /&gt;
		return returnValue&lt;br /&gt;
	end&lt;br /&gt;
	local isValidDate = function(iso_date, dateType)&lt;br /&gt;
		if (dateType == &amp;quot;YEAR&amp;quot;) then&lt;br /&gt;
			if tonumber(iso_date) &amp;lt; 0 then return false else return true end&lt;br /&gt;
		end&lt;br /&gt;
		if (dateType == &amp;quot;DM&amp;quot; ) then&lt;br /&gt;
			local month, day = string.match(iso_date, &amp;quot;(%d+).(%d+)&amp;quot;)&lt;br /&gt;
			month, day = tonumber(month), tonumber(day)&lt;br /&gt;
			if month &amp;gt; 12 or day &amp;gt; 31 then return false end&lt;br /&gt;
			if month == 4 or month == 6 or month == 9 or month == 11 then return day &amp;lt;= 30 end&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
		if (dateType == &amp;quot;MY&amp;quot;) then&lt;br /&gt;
			local year, month = string.match(iso_date, &amp;quot;(%d+).(%d+)&amp;quot;)&lt;br /&gt;
			if tonumber(year) &amp;lt; 0 then return false end&lt;br /&gt;
			if tonumber(month) &amp;gt; 12 then return false end&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
		local year, month, day = string.match(iso_date, &amp;quot;(%d+).(%d+).(%d+)&amp;quot;)&lt;br /&gt;
		year, month, day = tonumber(year), tonumber(month), tonumber(day)&lt;br /&gt;
		if year &amp;lt; 0 or month &amp;lt; 0 or month &amp;gt; 12 or day &amp;lt; 0 or day &amp;gt; 31 then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		if month == 4 or month == 6 or month == 9 or month == 11 then return day &amp;lt;= 30 end&lt;br /&gt;
		if month == 2 then&lt;br /&gt;
			if (year % 100 ~= 0 and year % 4 == 0) or year % 400 == 0 then return day &amp;lt;= 29 else return day &amp;lt;= 28 end&lt;br /&gt;
		end&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local nf_date = frame.args.date&lt;br /&gt;
	local dateType = getDateType(nf_date)&lt;br /&gt;
	-- return dateType&lt;br /&gt;
	if not dateType then return &amp;quot;Invalid Entry&amp;quot; end&lt;br /&gt;
	local formatTo = frame.args.format or dateType&lt;br /&gt;
	local iso_date = dateToISO(nf_date, dateType)&lt;br /&gt;
	-- return iso_date&lt;br /&gt;
	if not isValidDate(iso_date, dateType) then return &amp;quot;Invalid Entry&amp;quot; end&lt;br /&gt;
	local f_date = isoToFormat(iso_date, formatTo)&lt;br /&gt;
	f_date =  addQuirks(f_date, nf_date, formatTo)&lt;br /&gt;
	return f_date&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Nathan fraignt</name></author>
	</entry>
</feed>