Mòideal:Date period
Coltas
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
Ùsaid - Usage
- For templates, you might want to use {{Date period}} instead.
{{#invoke:Date period|_main|dateA|dateB}}
Automatically formats two given dates with a space and and en dash. Dates can be of any format supported by Mòideal:Date.
If the month is the same, it is only shown once. If the month and day is the same, it will not show a second part at all. If the year is different, it will show the year no matter what.
Date A | Date B | Output |
---|---|---|
2021-02-19 | present | February 19 – present |
present | 2021-02-25 | present – February 25 |
2021-02-19 | 2021-02-25 | February 19 – 25 |
2021-02-19 | 2021-03-25 | February 19 – March 25 |
2020-02-19 | 2021-02-25 | February 19, 2020 – February 25, 2021 |
The year can be forcefully shown with the show-year
parameter (third parameter of p._main
).
Date A | Date B | show-year | Output |
---|---|---|---|
2021-02-19 | 2021-02-25 | no | February 19 – 25 |
2021-02-19 | 2021-02-25 | yes | February 19 – 25 |
2020-02-19 | 2021-02-25 | no | February 19, 2020 – February 25, 2021 |
2020-02-19 | 2021-02-25 | yes | February 19, 2020 – February 25, 2021 |
If one of the dates is invalid, the raw text will be displayed instead.
Date A | Date B | Output |
---|---|---|
2021-02-19 | Sometime far in the future. | February 19 – Sometime far in the future. |
Long ago | 2021-02-25 | Long ago – February 25 |
local Date = require('Mòideal:Date')._Date
local yesno = require('Mòideal:Yesno')
local p = {}
function p.main(frame)
return p._main(frame.args[1], frame.args[2], frame.args['force-year'])
end
function p._main(_dateA, _dateB, showYear)
if _dateA == nil and _dateB == nil then
error('Date A or B not provided.')
elseif _dateA == nil then
return Date(_dateA):text('%B %-d')
elseif _dateB == nil then
return Date(_dateB):text('%B %-d')
end
local dateA = Date(_dateA)
local dateB = Date(_dateB)
if dateA == nil and dateB == nil then
error("Either date A, date B, or both dates must be valid.")
end
-- Handles nil dateA or dateB, but not nil both.
local showYear = (yesno(showYear)) or (dateA or dateB).year ~= (dateB or dateA).year
-- Handle cases where one of the dates is not a valid date.
if dateA == nil and dateB ~= nil then
return _dateA .. ' – ' .. dateB:text('%B %-d') .. (showYear and (', ' .. dateB.year) or '')
elseif dateB == nil and dateA ~= nil then
return dateA:text('%B %-d') .. (showYear and (', ' .. dateA.year) or '') .. ' – ' .. _dateB
end
if dateA.year == dateB.year then
if dateA.month == dateB.month and dateA.day == dateB.day then
return dateA:text('%B %-d')
elseif dateA.month == dateB.month then
return dateA:text('%B %-d') .. ' – ' .. dateB.day .. (showYear and (', ' .. dateA.year) or '')
else
return dateA:text('%B %-d') .. ' – ' .. dateB:text('%B %-d') .. (showYear and (', ' .. dateA.year) or '')
end
else
return dateA:text('%B %-d, %-Y') .. ' – ' .. dateB:text('%B %-d, %-Y')
end
end
return p