<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wikiyouth.eu/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACalendar</id>
	<title>Module:Calendar - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wikiyouth.eu/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACalendar"/>
	<link rel="alternate" type="text/html" href="https://wikiyouth.eu/w/index.php?title=Module:Calendar&amp;action=history"/>
	<updated>2026-04-15T06:49:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wikiyouth.eu/w/index.php?title=Module:Calendar&amp;diff=35582&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wikiyouth.eu/w/index.php?title=Module:Calendar&amp;diff=35582&amp;oldid=prev"/>
		<updated>2025-04-09T08:42:57Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:42, 9 April 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki_wikiyouth:diff:1.41:old-35581:rev-35582 --&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wikiyouth.eu/w/index.php?title=Module:Calendar&amp;diff=35581&amp;oldid=prev</id>
		<title>en&gt;Jarekt: allow strings starting with YYYY-MM-DD date</title>
		<link rel="alternate" type="text/html" href="https://wikiyouth.eu/w/index.php?title=Module:Calendar&amp;diff=35581&amp;oldid=prev"/>
		<updated>2024-10-22T13:39:30Z</updated>

		<summary type="html">&lt;p&gt;allow strings starting with YYYY-MM-DD date&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
  __  __           _       _         ____      _                _            &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _ / ___|__ _| | ___ _ __   __| | __ _ _ __ &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_) |   / _` | |/ _ \ &amp;#039;_ \ / _` |/ _` | &amp;#039;__|&lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_| |__| (_| | |  __/ | | | (_| | (_| | |   &lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)\____\__,_|_|\___|_| |_|\__,_|\__,_|_|   &lt;br /&gt;
                                                                             &lt;br /&gt;
This module is intended for date conversion between Gregorian and Julian calendars&lt;br /&gt;
&lt;br /&gt;
Please do not modify this code without applying the changes first at Module:Calendar/sandbox &lt;br /&gt;
and testing at Module:Calendar/sandbox/testcases &lt;br /&gt;
&lt;br /&gt;
Maintainers:&lt;br /&gt;
* Jarekt&lt;br /&gt;
]]&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === External functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- === Version of the function to be called from other LUA codes&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Convert calendar date to  &amp;quot;Julian day number&amp;quot; (jdn) &lt;br /&gt;
code based on  https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_day_number&lt;br /&gt;
explanation based on http://www.cs.utsa.edu/~cs1063/projects/Spring2011/Project1/project1.html&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  jdn = _date2jdn(&amp;quot;2017-09-01&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
  ISOdate:    date in YYYY-MM-DD format&lt;br /&gt;
  gregorian:  int - &amp;quot;1&amp;quot; for gregorian calendar and &amp;quot;0&amp;quot; for Julian (optional with &amp;quot;1&amp;quot; as default)&lt;br /&gt;
  &lt;br /&gt;
Outputs:&lt;br /&gt;
  1: &amp;quot;Julian day number&amp;quot; as integer or number of days since Monday, January 1, 4713 BC&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function p._date2jdn(ISOdate, gregorian)&lt;br /&gt;
    ISOdate = mw.text.trim(ISOdate, &amp;quot;%s+&amp;quot;) -- trim ASCII whitespace and leading &amp;quot;+&amp;quot;&lt;br /&gt;
    if (#ISOdate&amp;lt;10) then -- string is too short to have YYYY-MM-DD date&lt;br /&gt;
    	return nil&lt;br /&gt;
    end&lt;br /&gt;
    -- date string has to start with YYYY-MM-DD date, possibly with a &amp;quot;-&amp;quot; in front&lt;br /&gt;
	local year, month, day = ISOdate:match( &amp;quot;^(-?%d%d%d%d)-(%d%d)-(%d%d)&amp;quot; )&lt;br /&gt;
	if not year then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif tonumber(year) &amp;lt; 0 then&lt;br /&gt;
		-- If year is less than 0, add one to convert from  the common era system in which&lt;br /&gt;
	    -- the year -1 (1 B.C.E) is followed by year 1 (1 C.E.) to a zero based date system&lt;br /&gt;
		year = year + 1&lt;br /&gt;
	end&lt;br /&gt;
	local a, b, c, d, y, m&lt;br /&gt;
	a = math.floor((14-month) / 12) -- will be 1 for January and February, and 0 for other months.&lt;br /&gt;
	y = year + 4800 - a             -- years since year –4800&lt;br /&gt;
	m = month + 12*a - 3            -- month number where 10 for January, 11 for February, 0 for March, 1 for April&lt;br /&gt;
	c = math.floor((153*m + 2)/5)   -- number of days since March 1&lt;br /&gt;
	if (gregorian or 1) &amp;gt;0 then	&lt;br /&gt;
		b = math.floor(y/4) - math.floor(y/100) + math.floor(y/400) -- number of leap years since y==0 (year –4800)&lt;br /&gt;
		d = 32045                   -- offset so the result will be 0 for January 1, 4713 BCE&lt;br /&gt;
	else&lt;br /&gt;
		b = math.floor(y/4)         -- number of leap years since y==0 (year –4800)&lt;br /&gt;
		d = 32083                   -- offset so the result will be 0 for January 1, 4713 BCE&lt;br /&gt;
	end&lt;br /&gt;
	return day + c + 365*y + b - d&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Convert &amp;quot;Julian day number&amp;quot; (jdn) to a calendar date &lt;br /&gt;
code based on  https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_day_number&lt;br /&gt;
explanation based on http://www.cs.utsa.edu/~cs1063/projects/Spring2011/Project1/project1.html&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  jdn = _date2jdn(&amp;quot;2017-09-01&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
  jdn:       integer - Julian day number or number of days since Monday, January 1, 4713 BC&lt;br /&gt;
  gregorian: int - &amp;quot;1&amp;quot; for gregorian calendar and &amp;quot;0&amp;quot; for Julian (optional with &amp;quot;1&amp;quot; as default)&lt;br /&gt;
  &lt;br /&gt;
Outputs:&lt;br /&gt;
  1: date in YYYY-MM-DD forma&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- Convert &amp;quot;Julian day number&amp;quot; (jdn) to a calendar date&lt;br /&gt;
-- &amp;quot;gregorian&amp;quot; is a 1 for gregorian calendar and 0 for Julian&lt;br /&gt;
-- based on https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_day_number&lt;br /&gt;
function p._jdn2date(jdn, gregorian)&lt;br /&gt;
  local f, e, g, h, year, month, day&lt;br /&gt;
&lt;br /&gt;
	f = jdn + 1401&lt;br /&gt;
	if (gregorian or 1) &amp;gt;0 then&lt;br /&gt;
		 f = f + math.floor((math.floor((4*jdn + 274277) / 146097) * 3) / 4) - 38&lt;br /&gt;
	end&lt;br /&gt;
	e = 4*f + 3&lt;br /&gt;
	g = math.floor(math.fmod(e, 1461) / 4)&lt;br /&gt;
	h = 5*g + 2&lt;br /&gt;
	day   = math.floor(math.fmod (h,153) / 5) + 1&lt;br /&gt;
	month = math.fmod (math.floor(h/153) + 2, 12) + 1&lt;br /&gt;
	year  = math.floor(e/1461) - 4716 + math.floor((14 - month) / 12)&lt;br /&gt;
	&lt;br /&gt;
	-- If year is less than 1, subtract one to convert from a zero based date system to the&lt;br /&gt;
	-- common era system in which the year -1 (1 B.C.E) is followed by year 1 (1 C.E.).&lt;br /&gt;
	if year &amp;lt; 1 then&lt;br /&gt;
			year = year - 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return string.format(&amp;#039;%04i-%02i-%02i&amp;#039;, year, month, day)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Tests if a string is a valid Gregorian date&lt;br /&gt;
Example usage:&lt;br /&gt;
  jdn = _valid_date(&amp;quot;2017-02-30&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
  ISOdate: date in YYYY-MM-DD string format  &lt;br /&gt;
  &lt;br /&gt;
Outputs:&lt;br /&gt;
  true or false&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function p._valid_date(ISOdate)&lt;br /&gt;
	local jdn = p._date2jdn(ISOdate, 1)&lt;br /&gt;
	if jdn then&lt;br /&gt;
		return (p._jdn2date(jdn, 1)==ISOdate)&lt;br /&gt;
	else&lt;br /&gt;
		return true -- date is not in YYYY-MM-DD format do not flag as invalid&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- === Versions of the function to be called from template namespace&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
--[[&lt;br /&gt;
Gregorian2Julian&lt;br /&gt;
 &lt;br /&gt;
Convert a date from Gregorian to Julian calendar&lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Calendar|Gregorian2Julian|YYYY-MM-DD}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
    1: Gregorian date in YYYY-MM-DD format&lt;br /&gt;
Output:&lt;br /&gt;
	1: Julian date in YYYY-MM-DD format or error message &amp;quot;Error parsing input date: .....&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
function p.Gregorian2Julian(frame)&lt;br /&gt;
	local jdn = p._date2jdn(frame.args[1], 1)&lt;br /&gt;
	if jdn then&lt;br /&gt;
		return p._jdn2date(jdn, 0)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;Error parsing input date: &amp;quot; .. frame.args[1]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Julian2Gregorian&lt;br /&gt;
 &lt;br /&gt;
Convert a date from Julian to Gregorian calendar&lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Calendar|Julian2Gregorian|YYYY-MM-DD}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
    1: Julian date in YYYY-MM-DD format&lt;br /&gt;
Output:&lt;br /&gt;
	1: Gregorian date in YYYY-MM-DD format or error message &amp;quot;Error parsing input date: .....&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
function p.Julian2Gregorian(frame)&lt;br /&gt;
	local jdn = p._date2jdn(frame.args[1], 0)&lt;br /&gt;
	if jdn then&lt;br /&gt;
		return p._jdn2date(jdn, 1)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;Error parsing input date: &amp;quot; .. frame.args[1]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
DayOfWeek&lt;br /&gt;
 &lt;br /&gt;
Return day of week based on gregorian date. Returned value is in English. However &lt;br /&gt;
one can easily combine it with #Switch parser function [w:Help:Switch parser function]&lt;br /&gt;
to translate to other languages&lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Calendar|DayOfWeek|date|lang=}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
    1: date in YYYY-MM-DD format using Gregorian calendar&lt;br /&gt;
Output:&lt;br /&gt;
	1: day of the week in English or error message &amp;quot;Error parsing input date: .....&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function p.DayOfWeek(frame)&lt;br /&gt;
	local jdn = p._date2jdn(frame.args[1], 1)&lt;br /&gt;
	local day = math.fmod(jdn, 7) + 1&lt;br /&gt;
	if day then&lt;br /&gt;
		local LUT = { &amp;quot;Monday&amp;quot;, &amp;quot;Tuesday&amp;quot;, &amp;quot;Wednesday&amp;quot;, &amp;quot;Thursday&amp;quot;, &amp;quot;Friday&amp;quot;, &amp;quot;Saturday&amp;quot;, &amp;quot;Sunday&amp;quot; }&lt;br /&gt;
		return LUT[day]&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;Error parsing input date: &amp;quot; .. frame.args[1]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
date2jdn&lt;br /&gt;
 &lt;br /&gt;
Convert calendar date to  &amp;quot;Julian day number&amp;quot; (jdn) &lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Calendar|date2jdn|date}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
    1: date in YYYY-MM-DD format (optional, if missing than today&amp;#039;s date will be used)&lt;br /&gt;
	2: calendar: &amp;quot;1&amp;quot; for Gregorian calendar and &amp;quot;0&amp;quot; for Julian (optional with &amp;quot;1&amp;quot; as default)&lt;br /&gt;
Output:&lt;br /&gt;
    1: &amp;quot;Julian day number&amp;quot; as integer or number of days since Monday, January 1, 4713 BC&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function p.date2jdn(frame)&lt;br /&gt;
	return p._date2jdn(frame.args[1] or os.date(&amp;#039;%F&amp;#039;), frame.args[2] or 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
jdn2date&lt;br /&gt;
 &lt;br /&gt;
Convert &amp;quot;Julian day number&amp;quot; (jdn) to calendar date&lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Calendar|jdn2date|jdn}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
    1: &amp;quot;Julian day number&amp;quot; as integer or number of days since Monday, January 1, 4713 BC&lt;br /&gt;
	2: calendar: &amp;quot;1&amp;quot; for gregorian calendar and &amp;quot;0&amp;quot; for Julian (optional with &amp;quot;1&amp;quot; as default)&lt;br /&gt;
Output:&lt;br /&gt;
    1: date in YYYY-MM-DD format &lt;br /&gt;
]]&lt;br /&gt;
function p.jdn2date(frame)&lt;br /&gt;
	return p._jdn2date(frame.args[1], frame.args[2] or 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Tests if a string is a valid Gregorian date&lt;br /&gt;
Example usage:&lt;br /&gt;
	{{#invoke:Calendar|valid_date|&amp;quot;2017-02-30&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
  ISOdate: date in YYYY-MM-DD string format  &lt;br /&gt;
  &lt;br /&gt;
Outputs:&lt;br /&gt;
  true or false&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function p.valid_date(frame)&lt;br /&gt;
	if p._valid_date(frame.args[1]) then&lt;br /&gt;
		return &amp;#039;date is valid&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;date is not valid&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>en&gt;Jarekt</name></author>
	</entry>
</feed>