<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://baripedia.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ADate_complexe</id>
	<title>Module:Date complexe - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://baripedia.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ADate_complexe"/>
	<link rel="alternate" type="text/html" href="https://baripedia.org/index.php?title=Module:Date_complexe&amp;action=history"/>
	<updated>2026-06-13T12:10:19Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.38.6</generator>
	<entry>
		<id>https://baripedia.org/index.php?title=Module:Date_complexe&amp;diff=30852&amp;oldid=prev</id>
		<title>Arthur : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://baripedia.org/index.php?title=Module:Date_complexe&amp;diff=30852&amp;oldid=prev"/>
		<updated>2016-01-27T20:14:00Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- TODO: améliorer les synergies avec Module:Date (gestion par module:Date de dates sans lien et de &amp;quot;XIe siècle en astronautique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local datemodule = require 'Module:Date'&lt;br /&gt;
local linguistic = require 'Module:Linguistique'&lt;br /&gt;
local roman = require 'Module:Romain'&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local numericprecision = { -- convertir les précisions en valeurs numériques = à celles utilisées par Wikidata&lt;br /&gt;
	gigayear = 0,&lt;br /&gt;
	megayear = 3,&lt;br /&gt;
	millenium = 6,&lt;br /&gt;
	century = 7,&lt;br /&gt;
	decade = 8,&lt;br /&gt;
	year = 9,&lt;br /&gt;
	month = 10,&lt;br /&gt;
	day = 11,&lt;br /&gt;
	hour = 12,&lt;br /&gt;
	minute = 12,&lt;br /&gt;
	second = 14,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function vowelfirst(str)&lt;br /&gt;
	return linguistic.vowelfirst(str)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function setprecision(obj, maxprecision)&lt;br /&gt;
	if (not obj) or (type(obj) == 'string') then&lt;br /&gt;
		return obj&lt;br /&gt;
	end&lt;br /&gt;
	local precision = tonumber(obj.precision) or numericprecision[obj.precision]&lt;br /&gt;
	if maxprecision then&lt;br /&gt;
		maxprecision = tonumber(maxprecision) or numericprecision[maxprecision]&lt;br /&gt;
	end&lt;br /&gt;
	if maxprecision then&lt;br /&gt;
		return math.min(precision, maxprecision)&lt;br /&gt;
	end&lt;br /&gt;
	return precision&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function milleniumString(millenium, era, hideera)&lt;br /&gt;
	local str = roman.toRoman(millenium) .. '&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt; millénaire'&lt;br /&gt;
	if era == '-' and (not hideera) then&lt;br /&gt;
		str = str .. ' av. J.-C.'&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function centuryString(century, era, hideera)&lt;br /&gt;
	local str = roman.toRoman(century) .. '&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt; siècle'&lt;br /&gt;
	if era == '-' and (not hideera) then&lt;br /&gt;
		str = str .. ' av. J.-C.'&lt;br /&gt;
	end&lt;br /&gt;
	return '' -- trop d'erreurs sur Wikidata, en attente du UI correcte&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function decadeString(decade, era, hideera)&lt;br /&gt;
	local str = 'années ' .. decade .. '0'&lt;br /&gt;
	if era == '-' and (not hideera) then&lt;br /&gt;
		str = str .. ' av. J.-C.'&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.simplestring(dateobject, displayformat) &lt;br /&gt;
	-- transforme un object date ponctuel en texte&lt;br /&gt;
	-- les dates de type ISO devraient passer par Module:Date, mais il faut pouvoir désactiver les liens&lt;br /&gt;
	if type(dateobject) == 'string' or type(dateobject) == 'nil' then&lt;br /&gt;
		return dateobject&lt;br /&gt;
	end&lt;br /&gt;
	local era = dateobject.era&lt;br /&gt;
&lt;br /&gt;
	if not displayformat then&lt;br /&gt;
		displayformat = {}&lt;br /&gt;
	end&lt;br /&gt;
	local linktopic = displayformat.linktopic&lt;br /&gt;
	local nolinks&lt;br /&gt;
	if linktopic == '-' then&lt;br /&gt;
		nolinks = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local str&lt;br /&gt;
	local precision = setprecision(dateobject, displayformat.precision)&lt;br /&gt;
	&lt;br /&gt;
	-- formats gérés par ce module&lt;br /&gt;
	if precision == 6 then&lt;br /&gt;
		local millenium = math.floor(dateobject.year/1000) + 1&lt;br /&gt;
		str = milleniumString(millenium, era, hideera)&lt;br /&gt;
	elseif precision == 7 then&lt;br /&gt;
		local century = math.floor(dateobject.year/100) + 1&lt;br /&gt;
		str = centuryString(century, era, hideera)&lt;br /&gt;
	elseif precision == 8 then&lt;br /&gt;
		local decade = tostring(math.floor(dateobject.year/10))&lt;br /&gt;
		str = decadeString(decade, era, hideera)&lt;br /&gt;
	end&lt;br /&gt;
	if str then&lt;br /&gt;
		return str&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- formats gérés par Module:Date&lt;br /&gt;
	local year = dateobject.year&lt;br /&gt;
	if year and (era == '-') then&lt;br /&gt;
		year = 0 - year&lt;br /&gt;
	end&lt;br /&gt;
	local month, day&lt;br /&gt;
	&lt;br /&gt;
	if precision &amp;gt; 9 then&lt;br /&gt;
		month = dateobject.month&lt;br /&gt;
		if precision &amp;gt; 10 then&lt;br /&gt;
			day = dateobject.day&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local avJC -- équivalent de hideera pour modeleDate&lt;br /&gt;
	if displayformat.hideera then&lt;br /&gt;
		avJC = 'non'&lt;br /&gt;
	end&lt;br /&gt;
	str = datemodule.modeleDate{jour = day, mois = month, annee = year, qualificatif = linktopic, nolinks = nolinks, avJC = avJC}&lt;br /&gt;
	return str or ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromToNow(d, datestr, precision) -- retourne &amp;quot;depuis&amp;quot; plutôt que &amp;quot;à partir de&amp;quot; quand c'est pas terminé&lt;br /&gt;
	if (precision &amp;gt;= 11) or (precision == 7) or (precision == 6)  then -- ont dit &amp;quot;à partir du pour les dates avec jour, les siècles, les millénaires&lt;br /&gt;
		if voweverlfirst(datestr) then -- suppose l'absence de lien interne&lt;br /&gt;
			return &amp;quot;depuis l'&amp;quot; .. datestr&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;depuis le&amp;quot; .. datestr&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;depuis &amp;quot; .. datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromdate(d, displayformat)  -- retourne &amp;quot;à partir de date&amp;quot; en langage naturel&lt;br /&gt;
	displayformat = displayformat or {}&lt;br /&gt;
	local precision = setprecision(d, displayformat.precision)&lt;br /&gt;
	local datestr = p.simplestring(d, displayformat)&lt;br /&gt;
	if displayformat and displayformat.textformat == 'minimum' then&lt;br /&gt;
		return datestr -- par exemple pour les classements MH, juste afficher la date de début&lt;br /&gt;
	end&lt;br /&gt;
	if displayformat.stilltrue then return&lt;br /&gt;
		fromToNow(d, datestr, precision)&lt;br /&gt;
	end&lt;br /&gt;
	if (precision &amp;gt;= 11) or (precision == 7) or (precision == 6)  then -- ont dit &amp;quot;à partir du pour les dates avec jour, les siècles, les millénaires&lt;br /&gt;
		return 'à partir du ' .. datestr&lt;br /&gt;
	end&lt;br /&gt;
	if (precision == 10) and (vowelfirst(datemodule.nomDuMois(d.month))) then&lt;br /&gt;
		return &amp;quot;à partir d'&amp;quot; .. datestr&lt;br /&gt;
	end&lt;br /&gt;
	return 'à partir de ' .. datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function upto(d, displayformat)  -- retourne &amp;quot;jusqu'à date' en langage naturel&lt;br /&gt;
	displayformat = displayformat or {}&lt;br /&gt;
	local datestring = p.simplestring(d, displayformat)&lt;br /&gt;
	local precision = setprecision(d, displayformat.precision)&lt;br /&gt;
	if (precision &amp;gt;= 11) or (precision == 7) or (precision == 6) then --on dit &amp;quot;jusqu'au&amp;quot; pour les dates avec jour, et pour les siècles&lt;br /&gt;
		return 'jusqu\'au ' .. datestring&lt;br /&gt;
	elseif (precision &amp;gt; 9) then&lt;br /&gt;
		return &amp;quot;jusqu'à &amp;quot; .. datestring&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;jusqu\'en &amp;quot; .. datestring&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromuntillong(startstr, endstr, era, precision)&lt;br /&gt;
	-- on dit &amp;quot;du 3 au 14 janvier&amp;quot; mais &amp;quot;de septembe à octobre&lt;br /&gt;
	if precision &amp;gt;= 11 then -- &amp;gt;= day&lt;br /&gt;
		return &amp;quot;du &amp;quot; .. startstr .. &amp;quot; au &amp;quot; ..  endstr .. era&lt;br /&gt;
	else&lt;br /&gt;
		if vowelfirst(startstr) then&lt;br /&gt;
			return &amp;quot;d'&amp;quot; .. startstr .. &amp;quot; à &amp;quot;.. endstr .. era&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;de &amp;quot; .. startstr .. &amp;quot; à &amp;quot; .. endstr .. era&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeclutter(startpoint, endpoint, precision, displayformat) -- prépare à rendre la date plus jolie : &amp;quot;juin 445 av-JC-juillet 445 av-JC -&amp;gt; juin-juillet 445-av-JC&amp;quot;&lt;br /&gt;
	if (type(startpoint) ~= 'table') or (type(endpoint) ~= 'table') then&lt;br /&gt;
		return startpoint, endpoint, precision, displayformat&lt;br /&gt;
	end&lt;br /&gt;
	local era = endpoint.era&lt;br /&gt;
	local sameera&lt;br /&gt;
	if startpoint.era == endpoint.era then&lt;br /&gt;
		sameera = true&lt;br /&gt;
	end&lt;br /&gt;
	if (endpoint.year == startpoint.year) then&lt;br /&gt;
		startpoint.year = startpoint.year .. '-'&lt;br /&gt;
		if (startpoint.month == endpoint.month) then&lt;br /&gt;
			startpoint.month = startpoint.month .. '-'&lt;br /&gt;
			if (startpoint.day == endpoint.day) then&lt;br /&gt;
				startpoint.day = ''&lt;br /&gt;
				startpoint.month = ''&lt;br /&gt;
				startpoint.year = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return startpoint, endpoint, era, displayformat, sameera&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromuntil(startpoint, endpoint, displayformat)&lt;br /&gt;
	displayformat = displayformat or {}&lt;br /&gt;
	local precision = setprecision(endpoint, displayformat.precision)&lt;br /&gt;
&lt;br /&gt;
 	-- analyse les paramètres pour éviter les redondances&lt;br /&gt;
 	&lt;br /&gt;
	local startpoint, endpoint, era, displayformat, sameera = removeclutter(startpoint, endpoint, precision, displayformat)&lt;br /&gt;
&lt;br /&gt;
	displayformat.hideera = true&lt;br /&gt;
	&lt;br /&gt;
	local startstr, endstr =  p.simplestring(startpoint, displayformat), p.simplestring(endpoint, displayformat)&lt;br /&gt;
	if (startstr == '') or (startstr == endstr) then&lt;br /&gt;
		if (not sameera) then&lt;br /&gt;
			displayformat.hideera = false --sinon c'est incompréhensible&lt;br /&gt;
			return p.simplestring(endpoint, displayformat)&lt;br /&gt;
		end&lt;br /&gt;
		return endstr&lt;br /&gt;
	end&lt;br /&gt;
	-- pour éviter les tournures répétitives comme  &amp;quot;du 13 septembre 2006 au 18 september 2006&amp;quot;&lt;br /&gt;
	if era == '-' then&lt;br /&gt;
		era = ' av J-C'&lt;br /&gt;
	else&lt;br /&gt;
		era = ''&lt;br /&gt;
	end&lt;br /&gt;
	if displayformat.textformat == 'long' then&lt;br /&gt;
		return fromuntillong(startstr, endstr, era, precision)&lt;br /&gt;
	else&lt;br /&gt;
		return startstr .. '-&amp;lt;wbr&amp;gt;' .. endstr .. era&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.fuzzydate(dateobjet, displayformat)&lt;br /&gt;
	local str = p.simplestring(dateobject, displayformat)&lt;br /&gt;
	return &amp;quot;vers &amp;quot; .. str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.daterange(startpoint, endpoint, displayformat)&lt;br /&gt;
	if startpoint and endpoint then&lt;br /&gt;
		return fromuntil(startpoint, endpoint, displayformat)&lt;br /&gt;
	elseif startpoint then&lt;br /&gt;
		return fromdate(startpoint, displayformat)&lt;br /&gt;
	elseif endpoint then&lt;br /&gt;
		return upto(endpoint, displayformat)&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.duration(start, ending)&lt;br /&gt;
	if (not start) or (not ending) then&lt;br /&gt;
		return nil -- ?&lt;br /&gt;
	end&lt;br /&gt;
	return datemodule.age(start.year, start.month, start.day, ending.year, ending.month, ending.day)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitWDdate(str) -- depuis datavalue.value.time de Wikidata, fonctionnerait aussi en utilisant simplement splitISO&lt;br /&gt;
	local pattern = &amp;quot;(%W)(%d+)%-(%d+)%-(%d+)&amp;quot;&lt;br /&gt;
	local era, year, month, day = str:match(pattern)&lt;br /&gt;
	return era, year, month, day&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitISO(str)&lt;br /&gt;
	local era, year, month, day&lt;br /&gt;
	era = string.sub(str, 1, 1)&lt;br /&gt;
	if tonumber(era) then&lt;br /&gt;
		era = '+'&lt;br /&gt;
	end&lt;br /&gt;
	local f = string.gmatch(str, '%d+')&lt;br /&gt;
	year, month, day = f(), f(), f()&lt;br /&gt;
	return era, year, month, day&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitDate(orig, calendar)&lt;br /&gt;
	if not orig then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if type(orig) == 'table' then&lt;br /&gt;
		return orig&lt;br /&gt;
	end&lt;br /&gt;
	if type(orig) ~= 'string' then&lt;br /&gt;
		return error(&amp;quot;bad datatype for date, string expected, got &amp;quot; .. type(orig))&lt;br /&gt;
	end&lt;br /&gt;
	local era, y, m, d = splitWDdate(orig) &lt;br /&gt;
	if not era then&lt;br /&gt;
		era, y, m, d = splitISO(orig)&lt;br /&gt;
	end&lt;br /&gt;
	if calendar == 'julian' then&lt;br /&gt;
		y, m, d = formatdate.gregorianToJulian( era .. y, m, d )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	y, m, d = tonumber(y or 1), tonumber(m or 1), tonumber(d or 1)&lt;br /&gt;
	return {day = d, month = m, year = y, era = era, timestamp = timestamp, type = 'dateobject'}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.before(a, b) -- return true if b is before a or if at least one of a or b is missing&lt;br /&gt;
	a = p.splitDate(a) &lt;br /&gt;
	b = p.splitDate(b)&lt;br /&gt;
	if (not a) or (not b) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	local order = {'era', 'year', 'month', 'day'}&lt;br /&gt;
	for i, j in pairs(order) do&lt;br /&gt;
		if b[j] &amp;lt; a[j] then&lt;br /&gt;
			return true&lt;br /&gt;
		elseif b[j] &amp;gt; a[j] then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Arthur</name></author>
	</entry>
	<entry>
		<id>https://baripedia.org/index.php?title=Module:Date_complexe&amp;diff=28279&amp;oldid=prev</id>
		<title>Arthur : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://baripedia.org/index.php?title=Module:Date_complexe&amp;diff=28279&amp;oldid=prev"/>
		<updated>2015-11-09T20:49:15Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- TODO: améliorer les synergies avec Module:Date (gestion par module:Date de dates sans lien et de &amp;quot;XIe siècle en astronautique&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local datemodule = require 'Module:Date'&lt;br /&gt;
local linguistic = require 'Module:Linguistique'&lt;br /&gt;
local roman = require 'Module:Romain'&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local numericprecision = { -- convertir les précisions en valeurs numériques = à celles utilisées par Wikidata&lt;br /&gt;
	gigayear = 0,&lt;br /&gt;
	megayear = 3,&lt;br /&gt;
	millenium = 6,&lt;br /&gt;
	century = 7,&lt;br /&gt;
	decade = 8,&lt;br /&gt;
	year = 9,&lt;br /&gt;
	month = 10,&lt;br /&gt;
	day = 11,&lt;br /&gt;
	hour = 12,&lt;br /&gt;
	minute = 12,&lt;br /&gt;
	second = 14,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function vowelfirst(str)&lt;br /&gt;
	return linguistic.vowelfirst(str)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function setprecision(obj, maxprecision)&lt;br /&gt;
	if (not obj) or (type(obj) == 'string') then&lt;br /&gt;
		return obj&lt;br /&gt;
	end&lt;br /&gt;
	local precision = tonumber(obj.precision) or numericprecision[obj.precision]&lt;br /&gt;
	if maxprecision then&lt;br /&gt;
		maxprecision = tonumber(maxprecision) or numericprecision[maxprecision]&lt;br /&gt;
	end&lt;br /&gt;
	if maxprecision then&lt;br /&gt;
		return math.min(precision, maxprecision)&lt;br /&gt;
	end&lt;br /&gt;
	return precision&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function milleniumString(millenium, era, hideera)&lt;br /&gt;
	local str = roman.toRoman(millenium) .. '&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt; millénaire'&lt;br /&gt;
	if era == '-' and (not hideera) then&lt;br /&gt;
		str = str .. ' av. J.-C.'&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function centuryString(century, era, hideera)&lt;br /&gt;
	local str = roman.toRoman(century) .. '&amp;lt;sup&amp;gt;e&amp;lt;/sup&amp;gt; siècle'&lt;br /&gt;
	if era == '-' and (not hideera) then&lt;br /&gt;
		str = str .. ' av. J.-C.'&lt;br /&gt;
	end&lt;br /&gt;
	return '' -- trop d'erreurs sur Wikidata, en attente du UI correcte&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function decadeString(decade, era, hideera)&lt;br /&gt;
	local str = 'années ' .. decade .. '0'&lt;br /&gt;
	if era == '-' and (not hideera) then&lt;br /&gt;
		str = str .. ' av. J.-C.'&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.simplestring(dateobject, displayformat) &lt;br /&gt;
	-- transforme un object date ponctuel en texte&lt;br /&gt;
	-- les dates de type ISO devraient passer par Module:Date, mais il faut pouvoir désactiver les liens&lt;br /&gt;
	if type(dateobject) == 'string' or type(dateobject) == 'nil' then&lt;br /&gt;
		return dateobject&lt;br /&gt;
	end&lt;br /&gt;
	local era = dateobject.era&lt;br /&gt;
&lt;br /&gt;
	if not displayformat then&lt;br /&gt;
		displayformat = {}&lt;br /&gt;
	end&lt;br /&gt;
	local linktopic = displayformat.linktopic&lt;br /&gt;
	local nolinks&lt;br /&gt;
	if linktopic == '-' then&lt;br /&gt;
		nolinks = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local str&lt;br /&gt;
	local precision = setprecision(dateobject, displayformat.precision)&lt;br /&gt;
	&lt;br /&gt;
	-- formats gérés par ce module&lt;br /&gt;
	if precision == 6 then&lt;br /&gt;
		local millenium = math.floor(dateobject.year/1000) + 1&lt;br /&gt;
		str = milleniumString(millenium, era, hideera)&lt;br /&gt;
	elseif precision == 7 then&lt;br /&gt;
		local century = math.floor(dateobject.year/100) + 1&lt;br /&gt;
		str = centuryString(century, era, hideera)&lt;br /&gt;
	elseif precision == 8 then&lt;br /&gt;
		local decade = tostring(math.floor(dateobject.year/10))&lt;br /&gt;
		str = decadeString(decade, era, hideera)&lt;br /&gt;
	end&lt;br /&gt;
	if str then&lt;br /&gt;
		return str&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- formats gérés par Module:Date&lt;br /&gt;
	local yearstr =  tostring((era) .. (dateobject.year or ''))&lt;br /&gt;
	if (yearstr == '+') or (yearstr == '-') then&lt;br /&gt;
		yearstr = nil&lt;br /&gt;
	end&lt;br /&gt;
	local monthstr, daystr = tostring(dateobject.month), tostring(dateobject.day)&lt;br /&gt;
	&lt;br /&gt;
	local avJC -- équivalent de hideera pour modeleDate&lt;br /&gt;
	if displayformat.hideera then&lt;br /&gt;
		avJC = 'non'&lt;br /&gt;
	end&lt;br /&gt;
	if precision == 9 then&lt;br /&gt;
		str = datemodule.modeleDate{nil, nil, yearstr, linktopic, nolinks = nolinks, avJC = avJC }&lt;br /&gt;
	elseif precision == 10 then&lt;br /&gt;
		daystr = nil&lt;br /&gt;
		str = datemodule.modeleDate{nil, monthstr, yearstr, linktopic, nolinks = nolinks, avJC = avJC}&lt;br /&gt;
	else&lt;br /&gt;
		str = datemodule.modeleDate{daystr, monthstr, yearstr, linktopic, nolinks = nolinks, avJC = avJC}&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromToNow(d, datestr, precision) -- retourne &amp;quot;depuis&amp;quot; plutôt que &amp;quot;à partir de&amp;quot; quand c'est pas terminé&lt;br /&gt;
	if (precision &amp;gt;= 11) or (precision == 7) or (precision == 6)  then -- ont dit &amp;quot;à partir du pour les dates avec jour, les siècles, les millénaires&lt;br /&gt;
		if voweverlfirst(datestr) then -- suppose l'absence de lien interne&lt;br /&gt;
			return &amp;quot;depuis l'&amp;quot; .. datestr&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;depuis le&amp;quot; .. datestr&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;depuis &amp;quot; .. datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromdate(d, displayformat)  -- retourne &amp;quot;à partir de date&amp;quot; en langage naturel&lt;br /&gt;
	displayformat = displayformat or {}&lt;br /&gt;
	local precision = setprecision(d, displayformat.precision)&lt;br /&gt;
	local datestr = p.simplestring(d, displayformat)&lt;br /&gt;
	if displayformat and displayformat.textformat == 'minimum' then&lt;br /&gt;
		return datestr -- par exemple pour les classements MH, juste afficher la date de début&lt;br /&gt;
	end&lt;br /&gt;
	if displayformat.stilltrue then return&lt;br /&gt;
		fromToNow(d, datestr, precision)&lt;br /&gt;
	end&lt;br /&gt;
	if (precision &amp;gt;= 11) or (precision == 7) or (precision == 6)  then -- ont dit &amp;quot;à partir du pour les dates avec jour, les siècles, les millénaires&lt;br /&gt;
		return 'à partir du ' .. datestr&lt;br /&gt;
	end&lt;br /&gt;
	if (precision == 10) and (vowelfirst(datemodule.nomDuMois(d.month))) then&lt;br /&gt;
		return &amp;quot;à partir d'&amp;quot; .. datestr&lt;br /&gt;
	end&lt;br /&gt;
	return 'à partir de ' .. datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function upto(d, displayformat)  -- retourne &amp;quot;jusqu'à date' en langage naturel&lt;br /&gt;
	displayformat = displayformat or {}&lt;br /&gt;
	local datestring = p.simplestring(d, displayformat)&lt;br /&gt;
	local precision = setprecision(d, displayformat.precision)&lt;br /&gt;
	if (precision &amp;gt;= 11) or (precision == 7) or (precision == 6) then --on dit &amp;quot;jusqu'au&amp;quot; pour les dates avec jour, et pour les siècles&lt;br /&gt;
		return 'jusqu\'au ' .. datestring&lt;br /&gt;
	elseif (precision &amp;gt; 9) then&lt;br /&gt;
		return &amp;quot;jusqu'à &amp;quot; .. datestring&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;jusqu\'en &amp;quot; .. datestring&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromuntillong(startstr, endstr, era, precision)&lt;br /&gt;
	-- on dit &amp;quot;du 3 au 14 janvier&amp;quot; mais &amp;quot;de septembe à octobre&lt;br /&gt;
	if precision &amp;gt;= 11 then -- &amp;gt;= day&lt;br /&gt;
		return &amp;quot;du &amp;quot; .. startstr .. &amp;quot; au &amp;quot; ..  endstr .. era&lt;br /&gt;
	else&lt;br /&gt;
		if vowelfirst(startstr) then&lt;br /&gt;
			return &amp;quot;d'&amp;quot; .. startstr .. &amp;quot; à &amp;quot;.. endstr .. era&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;de &amp;quot; .. startstr .. &amp;quot; à &amp;quot; .. endstr .. era&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeclutter(startpoint, endpoint, precision, displayformat) -- prépare à rendre la date plus jolie : &amp;quot;juin 445 av-JC-juillet 445 av-JC -&amp;gt; juin-juillet 445-av-JC&amp;quot;&lt;br /&gt;
	if (type(startpoint) ~= 'table') or (type(endpoint) ~= 'table') then&lt;br /&gt;
		return startpoint, endpoint, precision, displayformat&lt;br /&gt;
	end&lt;br /&gt;
	local era = endpoint.era&lt;br /&gt;
	local sameera&lt;br /&gt;
	if startpoint.era == endpoint.era then&lt;br /&gt;
		sameera = true&lt;br /&gt;
	end&lt;br /&gt;
	if (endpoint.year == startpoint.year) then&lt;br /&gt;
		startpoint.year = nil&lt;br /&gt;
		if (startpoint.month == endpoint.month) then&lt;br /&gt;
			startpoint.month = ''&lt;br /&gt;
			if (startpoint.day == endpoint.day) then&lt;br /&gt;
				startpoint.day = ''&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return startpoint, endpoint, era, displayformat, sameera&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fromuntil(startpoint, endpoint, displayformat)&lt;br /&gt;
	displayformat = displayformat or {}&lt;br /&gt;
	local precision = setprecision(endpoint, displayformat.precision)&lt;br /&gt;
&lt;br /&gt;
 	-- analyse les paramètres pour éviter les redondances&lt;br /&gt;
 	&lt;br /&gt;
	local startpoint, endpoint, era, displayformat, sameera = removeclutter(startpoint, endpoint, precision, displayformat)&lt;br /&gt;
&lt;br /&gt;
	displayformat.hideera = true&lt;br /&gt;
	&lt;br /&gt;
	local startstr, endstr =  p.simplestring(startpoint, displayformat), p.simplestring(endpoint, displayformat)&lt;br /&gt;
	if (startstr == '') or (startstr == endstr) then&lt;br /&gt;
		if (not sameera) then&lt;br /&gt;
			displayformat.hideera = false --sinon c'est incompréhensible&lt;br /&gt;
			return p.simplestring(endpoint, displayformat)&lt;br /&gt;
		end&lt;br /&gt;
		return endstr&lt;br /&gt;
	end&lt;br /&gt;
	-- pour éviter les tournures répétitives comme  &amp;quot;du 13 septembre 2006 au 18 september 2006&amp;quot;&lt;br /&gt;
	if era == '-' then&lt;br /&gt;
		era = ' av J-C'&lt;br /&gt;
	else&lt;br /&gt;
		era = ''&lt;br /&gt;
	end&lt;br /&gt;
	if displayformat.textformat == 'long' then&lt;br /&gt;
		return fromuntillong(startstr, endstr, era, precision)&lt;br /&gt;
	else&lt;br /&gt;
		return startstr .. '-' .. endstr .. era&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.fuzzydate(dateobjet, displayformat)&lt;br /&gt;
	local str = p.simplestring(dateobject, displayformat)&lt;br /&gt;
	return &amp;quot;vers &amp;quot; .. str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.daterange(startpoint, endpoint, displayformat)&lt;br /&gt;
	if startpoint and endpoint then&lt;br /&gt;
		return fromuntil(startpoint, endpoint, displayformat)&lt;br /&gt;
	elseif startpoint then&lt;br /&gt;
		return fromdate(startpoint, displayformat)&lt;br /&gt;
	elseif endpoint then&lt;br /&gt;
		return upto(endpoint, displayformat)&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.duration(start, ending)&lt;br /&gt;
	if (not start) or (not ending) then&lt;br /&gt;
		return nil -- ?&lt;br /&gt;
	end&lt;br /&gt;
	return datemodule.age(start.year, start.month, start.day, ending.year, ending.month, ending.day)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitWDdate(str) -- depuis datavalue.value.time de Wikidata, fonctionnerait aussi en utilisant simplement splitISO&lt;br /&gt;
	local pattern = &amp;quot;(%W)(%d+)%-(%d+)%-(%d+)&amp;quot;&lt;br /&gt;
	local era, year, month, day = str:match(pattern)&lt;br /&gt;
	return era, year, month, day&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function splitISO(str)&lt;br /&gt;
	local era, year, month, day&lt;br /&gt;
	era = string.sub(str, 1, 1)&lt;br /&gt;
	if tonumber(era) then&lt;br /&gt;
		era = '+'&lt;br /&gt;
	end&lt;br /&gt;
	local f = string.gmatch(str, '%d+')&lt;br /&gt;
	year, month, day = f(), f(), f()&lt;br /&gt;
	return era, year, month, day&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitDate(orig, calendar)&lt;br /&gt;
	if not orig then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if type(orig) == 'table' then&lt;br /&gt;
		return orig&lt;br /&gt;
	end&lt;br /&gt;
	if type(orig) ~= 'string' then&lt;br /&gt;
		return error(&amp;quot;bad datatype for date, string expected, got &amp;quot; .. type(orig))&lt;br /&gt;
	end&lt;br /&gt;
	local era, y, m, d = splitWDdate(orig) &lt;br /&gt;
	if not era then&lt;br /&gt;
		era, y, m, d = splitISO(orig)&lt;br /&gt;
	end&lt;br /&gt;
	if calendar == 'julian' then&lt;br /&gt;
		y, m, d = formatdate.gregorianToJulian( era .. y, m, d )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	y, m, d = tonumber(y or 1), tonumber(m or 1), tonumber(d or 1)&lt;br /&gt;
	return {day = d, month = m, year = y, era = era, timestamp = timestamp, type = 'dateobject'}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.before(a, b) -- return true if b is before a or if at least one of a or b is missing&lt;br /&gt;
	a = p.splitDate(a) &lt;br /&gt;
	b = p.splitDate(b)&lt;br /&gt;
	if (not a) or (not b) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	local order = {'era', 'year', 'month', 'day'}&lt;br /&gt;
	for i, j in pairs(order) do&lt;br /&gt;
		if b[j] &amp;lt; a[j] then&lt;br /&gt;
			return true&lt;br /&gt;
		elseif b[j] &amp;gt; a[j] then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Arthur</name></author>
	</entry>
</feed>