<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nb">
	<id>https://www.wikisida.no/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=184.22.149.62</id>
	<title>wikisida.no - Brukerbidrag [nb]</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikisida.no/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=184.22.149.62"/>
	<link rel="alternate" type="text/html" href="https://www.wikisida.no/index.php?title=Spesial:Bidrag/184.22.149.62"/>
	<updated>2026-06-15T13:47:02Z</updated>
	<subtitle>Brukerbidrag</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.wikisida.no/index.php?title=Modul:DateI18n&amp;diff=168874</id>
		<title>Modul:DateI18n</title>
		<link rel="alternate" type="text/html" href="https://www.wikisida.no/index.php?title=Modul:DateI18n&amp;diff=168874"/>
		<updated>2019-01-24T03:13:50Z</updated>

		<summary type="html">&lt;p&gt;184.22.149.62: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[  &lt;br /&gt;
End&lt;br /&gt;
start&lt;br /&gt;
&lt;br /&gt;
This module is intended for processing of date strings.&lt;br /&gt;
&lt;br /&gt;
Copied from https://commons.wikimedia.org/w/index.php?title=Module:Date&amp;amp;oldid=224728211&lt;br /&gt;
Used by Module:ISOdate, Module:Complex date, Module:WikidataIB&lt;br /&gt;
&lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Parent5446 - original version of the function mimicking template:ISOdate&lt;br /&gt;
* User:Jarekt - original version of the functions mimicking template:Date and template:ISOyear&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- === Dependencies ======================&lt;br /&gt;
-- =======================================&lt;br /&gt;
local i18n  = require(&#039;Module:I18n/date&#039;)		-- get localized translations of date formats&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local function langSwitch(list,lang)&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(lang)&lt;br /&gt;
	table.insert(langList,1,lang)&lt;br /&gt;
	for i,language in ipairs(langList) do&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
		return list[language]&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Date&lt;br /&gt;
 &lt;br /&gt;
This function can be used to provide an ISOdate template. &lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Date|Date|sec=|month=|time=|yaer=|minute=|second=|oshwah=|tzmin=|lang=en}}&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
  year,month,day,hour,minute,second: broken down date-time component strings&lt;br /&gt;
  tzhour, tzmin: timezone offset from UTC, hours and minutes&lt;br /&gt;
  lang: The language to display it in&lt;br /&gt;
  case: Language format (genitive, etc.) for some languages&lt;br /&gt;
 class: CSS class for the &amp;lt;time&amp;gt; node, use &amp;quot;&amp;quot; for no metadata at all&lt;br /&gt;
&lt;br /&gt;
 Error Handling:&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function p.Date(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	if not (args.lang and mw.language.isSupportedLanguage(args.lang)) then &lt;br /&gt;
		args.lang = frame:callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ) -- get user&#039;s chosen language &lt;br /&gt;
	end&lt;br /&gt;
	return p._Date(	&lt;br /&gt;
		{ &lt;br /&gt;
			args.year   or &#039;&#039;, &lt;br /&gt;
			args.month  or &#039;&#039;,&lt;br /&gt;
			args.day    or &#039;&#039;, &lt;br /&gt;
			args.hour   or &#039;&#039;, &lt;br /&gt;
			args.minute or &#039;&#039;, &lt;br /&gt;
			args.second or &#039;&#039;,&lt;br /&gt;
			args.tzhour or &#039;&#039;,&lt;br /&gt;
			args.tzmin  or &#039;&#039;&lt;br /&gt;
		},&lt;br /&gt;
		args.lang,                  -- language&lt;br /&gt;
		args.case  or &#039;&#039;,           -- allows to specify grammatical case for the month for languages that use them&lt;br /&gt;
		args.class or &#039;dtstart&#039;,    -- allows to set the html class of the time node where the date is included. This is useful for microformats.&lt;br /&gt;
		args.trim_year or &#039;100-999&#039; -- by default pad one and 2 digit years to be 4 digit long, while keeping 3 digit years as is&lt;br /&gt;
	)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p._Date(datevec, lang, case, class, trim_year)	&lt;br /&gt;
	-- make sure inputs are in the right format&lt;br /&gt;
	for i = #datevec + 1, 8 do&lt;br /&gt;
		datevec[i] = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if  not case  then case  = &#039;&#039; end&lt;br /&gt;
	if  not class then class = &#039;&#039; end&lt;br /&gt;
	if  not trim_year then trim_year = &#039;100-999&#039; end&lt;br /&gt;
&lt;br /&gt;
	-- if language is not provided than look up users language&lt;br /&gt;
	-- WARNING: This step should be done by the template as it does not seem to work as well here (cache issues?)&lt;br /&gt;
	if not lang or not mw.language.isValidCode( lang ) then&lt;br /&gt;
		lang = &#039;en&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Just in case someone broke the internationalization code than fix the english defaults&lt;br /&gt;
	if i18n.DateLang[&#039;en&#039;] == nil then&lt;br /&gt;
		i18n.DateLang[&#039;en&#039;] = &#039;en-form&#039;&lt;br /&gt;
	end	&lt;br /&gt;
	if i18n.DateFormat[&#039;en-form&#039;] == nil then&lt;br /&gt;
		i18n.DateFormat[&#039;en-form&#039;] = {YMDHMS=&#039;j F Y, H:i:s&#039;, YMDHM=&#039;j F Y, H:i&#039;, YMD=&#039;j F Y&#039;, YM=&#039;F Y&#039;, MD=&#039;j F&#039;, Y=&#039;Y&#039;}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- create datecode based on which variables are provided and check for out of bound values&lt;br /&gt;
	local maxval = {9999, 12, 31, 23, 59, 60, 23, 59} -- max values for year, month, ...&lt;br /&gt;
	local c = {&#039;Y&#039;, &#039;M&#039;, &#039;D&#039;, &#039;H&#039;, &#039;M&#039;, &#039;S&#039;, &#039;&#039;, &#039;&#039;}&lt;br /&gt;
	local datecode = &#039;&#039; -- a string signifying which combination of variables was provided&lt;br /&gt;
	local datenum = {}  -- date-time encoded as a vector = [year, month, ... , second]&lt;br /&gt;
	for i, v in ipairs( datevec ) do&lt;br /&gt;
		if v~=nil and v~=&#039;&#039; then&lt;br /&gt;
			datecode = datecode .. c[i]&lt;br /&gt;
			datenum[i] = tonumber(v)&lt;br /&gt;
			if datenum[i]==nil and i==2 then&lt;br /&gt;
				-- month is not a number -&amp;gt; check if it is a month name in English&lt;br /&gt;
				v = mw.language.new(&#039;en&#039;):formatDate( &amp;quot;n&amp;quot;, v)&lt;br /&gt;
				datenum[i] = tonumber(v)&lt;br /&gt;
			end&lt;br /&gt;
			if datenum[i]==nil or datenum[i]&amp;gt;maxval[i] then&lt;br /&gt;
				-- Some numbers are out of range -&amp;gt; abort and return the empty string&lt;br /&gt;
				return &#039;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- create time stamp string (for example 2000-02-20 02:20:20) based on which variables were provided&lt;br /&gt;
	local timeStamp&lt;br /&gt;
	if datecode == &#039;YMDHMS&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i %02i:%02i:%02i&#039;, datenum[1], datenum[2], datenum[3], datenum[4], datenum[5], datenum[6] )&lt;br /&gt;
	elseif datecode == &#039;YMDHM&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i %02i:%02i&#039;, datenum[1], datenum[2], datenum[3], datenum[4], datenum[5] )&lt;br /&gt;
	elseif datecode:sub(1,3)==&#039;YMD&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i&#039;, datenum[1], datenum[2], datenum[3] )&lt;br /&gt;
		datecode = &#039;YMD&#039; -- &#039;YMD&#039;, &#039;YMDHMS&#039; and &#039;YMDHM&#039; are the only supported format starting with &#039;YMD&#039;. All others will be converted to &#039;YMD&#039;&lt;br /&gt;
	elseif datecode == &#039;YM&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i&#039;, datenum[1], datenum[2] )&lt;br /&gt;
	elseif datecode:sub(1,1)==&#039;Y&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i&#039;, datenum[1] )&lt;br /&gt;
		datecode = &#039;Y&#039; &lt;br /&gt;
	elseif datecode == &#039;M&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i&#039;, 2000, datenum[2], 1 )&lt;br /&gt;
		class = &#039;&#039; -- date not complete -&amp;gt; no html formating or micro-tagging of date string&lt;br /&gt;
	elseif datecode == &#039;MD&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i&#039;, 2000, datenum[2], datenum[3] )&lt;br /&gt;
		class = &#039;&#039; -- date not complete -&amp;gt; no html formating or micro-tagging of date string&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;  -- format not supported&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- ==========================================================&lt;br /&gt;
	-- === Create Date String using in chosen language&lt;br /&gt;
	-- ==========================================================&lt;br /&gt;
	&lt;br /&gt;
	-- which form should the date take? &lt;br /&gt;
	-- Use langSwitch to pick formating for each language&lt;br /&gt;
	local langDateForm = langSwitch(i18n.DateLang, lang)&lt;br /&gt;
	&lt;br /&gt;
	-- special case of French and Gallic dates, which require different date format for the 1st day of the month&lt;br /&gt;
	if datenum[3]==1 and (langDateForm==&#039;fr-form&#039; or langDateForm==&#039;ga-form&#039;) then&lt;br /&gt;
		langDateForm = langDateForm .. &#039;1&#039; -- ordinal form for the first day of the month&lt;br /&gt;
	end&lt;br /&gt;
	-- special case of Basque dates, which require different date format for the 1st, 11th, 21st and 31st day of the month&lt;br /&gt;
	if langDateForm==&#039;eu-form&#039; then&lt;br /&gt;
		if (datenum[3]==1 or datenum[3]==21) then&lt;br /&gt;
			langDateForm = &#039;eu-form01&#039;&lt;br /&gt;
		elseif (datenum[3]==11 or datenum[3]==31) then&lt;br /&gt;
			langDateForm = &#039;eu-form11&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Look up country specific format input to {{#time}} function&lt;br /&gt;
	local dFormat = i18n.DateFormat[langDateForm][datecode]&lt;br /&gt;
	&lt;br /&gt;
	-- overwrite default grammatical case of the month (applies mostly to Slavic languages)&lt;br /&gt;
	if (case==&#039;gen&#039;) then&lt;br /&gt;
		-- CAUTION: at the moment i18n.DateFormat uses &amp;quot;F&amp;quot; only as month name, but this might change and this operation does not check if &#039;F&#039; is in &amp;quot;&amp;quot; brackets or not, so if some language starts using &#039;F&#039;  in &amp;quot;&amp;quot; than this will not work for that language&lt;br /&gt;
		dFormat = dFormat:gsub(&amp;quot;F&amp;quot;, &amp;quot;xg&amp;quot;); &lt;br /&gt;
	end&lt;br /&gt;
	if (case==&#039;nom&#039;) then&lt;br /&gt;
		-- CAUTION: at the moment i18n.DateFormat uses &amp;quot;xg&amp;quot; only as month name, but this might change and this operation does not check if &#039;xg&#039; is in &amp;quot;&amp;quot; brackets or not, so if some language starts using &#039;xg&#039;  in &amp;quot;&amp;quot; than this will not work for that language&lt;br /&gt;
		dFormat = dFormat:gsub(&amp;quot;xg&amp;quot;, &amp;quot;F&amp;quot;);&lt;br /&gt;
	end&lt;br /&gt;
	if ((lang==&#039;ru&#039; or lang==&#039;pl&#039; or lang==&#039;cs&#039; or lang==&#039;sl&#039; or lang==&#039;sk&#039;) and (case==&#039;loc&#039; or case==&#039;ins&#039;)) or&lt;br /&gt;
		(lang==&#039;fi&#039; and (case==&#039;ptv&#039; or case==&#039;ine&#039;or case==&#039;ela&#039;or case==&#039;ill&#039;) ) then&lt;br /&gt;
		local monthEn =  mw.language.new(&#039;en&#039;):formatDate( &amp;quot;F&amp;quot;, timeStamp) -- month name in English&lt;br /&gt;
		-- month name using proper case and language. It relies on messages stored in MediaWiki namespace for some cases and languages&lt;br /&gt;
		-- That is why this IF statement uses &amp;quot;lang&amp;quot; not &amp;quot;langDateForm&amp;quot; variable to decide&lt;br /&gt;
		local monthMsg =  mw.message.new( string.format(&#039;%s-%s&#039;, monthEn, case ) ):inLanguage( lang )&lt;br /&gt;
		if not monthMsg:isDisabled() then -- make sure it exists&lt;br /&gt;
			local month=monthMsg:plain()&lt;br /&gt;
			dFormat = dFormat:gsub(&#039;F&#039;, &#039;&amp;quot;&#039;..month..&#039;&amp;quot;&#039;); -- replace default month with month name we already looked up&lt;br /&gt;
			dFormat = dFormat:gsub(&#039;xg&#039;, &#039;&amp;quot;&#039;..month..&#039;&amp;quot;&#039;);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Special case related to Quechua and Kichwa languages&lt;br /&gt;
	-- see https://commons.wikimedia.org/wiki/Template_talk:Date#Quechua from 2014&lt;br /&gt;
	if (lang==&#039;qu&#039; or lang==&#039;qug&#039;) and case==&#039;nom&#039; then&lt;br /&gt;
		dFormat = dFormat:gsub(&#039;F&amp;quot;pi&amp;quot;&#039;, &#039;F&#039;);&lt;br /&gt;
	end	&lt;br /&gt;
&lt;br /&gt;
	-- Lua only date formating using {{#time}} parser function (new)&lt;br /&gt;
		-- prefered call which gives &amp;quot;Lua error: too many language codes requested.&amp;quot; on the [[Module talk:Date/sandbox/testcases]] page&lt;br /&gt;
		--local datestr = mw.language.new(lang):formatDate( dFormat, timeStamp) &lt;br /&gt;
	local datestr = mw.getCurrentFrame():callParserFunction( &amp;quot;#time&amp;quot;, { dFormat, timeStamp, lang } )&lt;br /&gt;
	&lt;br /&gt;
	-- Another special case related to Thai solar calendar&lt;br /&gt;
	if lang==&#039;th&#039; and datenum[1]~= nil and datenum[1]&amp;lt;=1940 then&lt;br /&gt;
		-- As of 2014 {{#time}} parser function did not resolve those cases properly&lt;br /&gt;
		-- See https://en.wikipedia.org/wiki/Thai_solar_calendar#New_year for reference&lt;br /&gt;
		-- Disable once https://bugzilla.wikimedia.org/show_bug.cgi?id=66648 is fixed&lt;br /&gt;
		if datecode==&#039;Y&#039; then -- date is ambiguous&lt;br /&gt;
			datestr = string.format(&#039;%04i หรือ %04i&#039;, datenum[1]+542, datenum[1]+543 ) &lt;br /&gt;
		elseif datenum[2]&amp;lt;=3 then -- year is wrong (one too many)&lt;br /&gt;
			datestr = datestr:gsub( string.format(&#039;%04i&#039;, datenum[1]+543), string.format(&#039;%04i&#039;, datenum[1]+542 ) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If year&amp;lt;1000 than either keep it padded to the length of 4 digits or trim it&lt;br /&gt;
	-- decide if the year will stay padded with zeros (for years in 0-999 range)&lt;br /&gt;
	if datenum[1]~= nil and datenum[1]&amp;lt;1000 then&lt;br /&gt;
		local trim = yesno(trim_year,nil)&lt;br /&gt;
		if trim == nil then&lt;br /&gt;
			local YMin, YMax = trim_year:match( &#039;(%d+)-(%d+)&#039; )&lt;br /&gt;
			trim = (YMin~=nil and datenum[1]&amp;gt;=tonumber(YMin) and datenum[1]&amp;lt;=tonumber(YMax)) &lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		-- If the date form isn&#039;t the Thai solar calendar, don&#039;t zero pad years in the range of 100-999.  &lt;br /&gt;
		-- If at some point support for Islamic/Hebrew/Japanese years is added, they may need to be skipped as well. &lt;br /&gt;
		if trim then&lt;br /&gt;
			--local yearStr1 = mw.language.new(lang):formatDate( &#039;Y&#039;, timeStamp)&lt;br /&gt;
			local yearStr1 = mw.getCurrentFrame():callParserFunction( &amp;quot;#time&amp;quot;, { &#039;Y&#039;, timeStamp, lang } )&lt;br /&gt;
			--local yearStr1 = datestr:match( &#039;%d%d%d%d&#039; ) -- 4 digits in a row (in any language) - that must be a year&lt;br /&gt;
			local yearStr2 = yearStr1&lt;br /&gt;
			local zeroStr = mw.ustring.sub(yearStr1,1,1)&lt;br /&gt;
			for i=1,3 do -- trim leading zeros&lt;br /&gt;
				if mw.ustring.sub(yearStr2,1,1)==zeroStr then&lt;br /&gt;
					yearStr2 = mw.ustring.sub(yearStr2, 2, 5-i)&lt;br /&gt;
				else&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			datestr = datestr:gsub( yearStr1, yearStr2 )&lt;br /&gt;
			--datestr = string.format(&#039;%s (%s, %s)&#039;, datestr, yearStr1, yearStr2 )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- append timezone if present&lt;br /&gt;
	if datevec[7] ~= &#039;&#039; and (datecode == &#039;YMDHMS&#039; or datecode == &#039;YMDHM&#039;) then&lt;br /&gt;
		local tzstr, tzhournum = &#039;&#039;, tonumber(datevec[7])&lt;br /&gt;
		if tzhournum &amp;lt; 0 then tzstr = &#039;−&#039; else tzstr = &#039;+&#039; end&lt;br /&gt;
		tzstr = tzstr..string.format(&amp;quot;%02d&amp;quot;, math.abs(tzhournum))..&#039;:&#039;&lt;br /&gt;
		if datevec[8] ~= &#039;&#039; then tzstr = tzstr..datevec[8] else tzstr = tzstr..&#039;00&#039; end&lt;br /&gt;
		datestr = datestr..&#039; &#039;..tzstr&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- html formating and tagging of date string&lt;br /&gt;
	if class ~= &#039;&#039; then&lt;br /&gt;
		local DateHtmlTags = &#039;&amp;lt;span style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;&amp;lt;time class=&amp;quot;%s&amp;quot; datetime=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/time&amp;gt;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
		datestr = DateHtmlTags:format(class, timeStamp, datestr)&lt;br /&gt;
	end&lt;br /&gt;
	return datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>184.22.149.62</name></author>
	</entry>
</feed>