Module:Calendar: Difference between revisions
From Neodyland Wiki
More actions
No edit summary |
No edit summary |
||
| Line 33: | Line 33: | ||
function p.date2jdn(ISOdate, gregorian) | function p.date2jdn(ISOdate, gregorian) | ||
year, month, day = ISOdate:match( " | year, month, day = ISOdate:match( "(%d%d%d%d)-(%d%d)-(%d%d)" ) | ||
if not year then | if not year then | ||
return nil | return nil | ||
| Line 54: | Line 54: | ||
-- Convert a date from Gregorian to Julian calendar | -- Convert a date from Gregorian to Julian calendar | ||
function p.Gregorian2Julian(frame) | function p.Gregorian2Julian(frame) | ||
local JDN = date2jdn(frame.args[1], 1) | local JDN = p.date2jdn(frame.args[1], 1) | ||
if JDN then | if JDN then | ||
local year, month, day = jdn2date(JDN, 0) | local year, month, day = p.jdn2date(JDN, 0) | ||
return string.format('%04i-%02i-02i', year, month, day) | return string.format('%04i-%02i-02i', year, month, day) | ||
else | else | ||
return "" | return "Error parsing input date: " .. frame.args[1] | ||
end | end | ||
end | end | ||
| Line 65: | Line 65: | ||
-- Convert a date from Julian to Gregorian calendar | -- Convert a date from Julian to Gregorian calendar | ||
function p.Julian2Gregorian(frame) | function p.Julian2Gregorian(frame) | ||
local JDN = date2jdn(frame.args[1], 0) | local JDN = p.date2jdn(frame.args[1], 0) | ||
if JDN then | if JDN then | ||
local year, month, day = jdn2date(JDN, 1) | local year, month, day = p.jdn2date(JDN, 1) | ||
return string.format('%04i-%02i-02i', year, month, day) | return string.format('%04i-%02i-02i', year, month, day) | ||
else | else | ||
return "" | return "Error parsing input date: " .. frame.args[1] | ||
end | end | ||
end | end | ||
| Line 76: | Line 76: | ||
-- Return day of week based on gregorian date. Mon->1, Tue->2, ..., Sun->7 | -- Return day of week based on gregorian date. Mon->1, Tue->2, ..., Sun->7 | ||
function p.DayOfWeek(frame) | function p.DayOfWeek(frame) | ||
local | local JDN = p.date2jdn(frame.args[1], 1) | ||
local day = math.fmod(JDN, 7) + 1 | |||
if day then | if day then | ||
local LUT = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" } | local LUT = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" } | ||
return LUT[day] | return LUT[day] | ||
else | else | ||
return "" | return "Error parsing input date: " .. frame.args[1] | ||
end | end | ||
end | end | ||
return p | return p | ||
Revision as of 15:41, 1 September 2017
This documentation is transcluded from Module:Calendar/doc.
local p = {}
-- Convert "Julian day number" (jdn) to a calendar date
-- "gregorian" is a 1 for gregorian calendar and 0 for Julian
-- based on https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_day_number
function p.jdn2date(jdn, gregorian)
local f, e, g, h, year, month, day
f = jdn + 1401
if gregorian>0 then
f = f + math.floor((math.floor((4*jdn + 274277) / 146097) * 3) / 4) - 38
end
e = 4*f + 3
g = math.floor(math.fmod(e, 1461) / 4)
h = 5*g + 2
day = math.floor((math.fmod(h,153)) / 5) + 1
month = math.fmod (math.floor(h/153) + 2, 12) + 1
year = math.floor(e/1461) - y + math.floor((12 + 2 - month) / 12)
-- If year is less than 1, subtract one to convert from a zero based date system to the
-- common era system in which the year -1 (1 B.C.E) is followed by year 1 (1 C.E.).
if year < 1 then
year = year - 1
end
return string.format('%04i-%02i-02i', year, month, day)
end
-- Convert calendar date to "Julian day number" (jdn)
-- "gregorian" is a 1 for gregorian calendar and 0 for Julian
-- based on https://en.wikipedia.org/wiki/Julian_day#Converting_Julian_or_Gregorian_calendar_date_to_Julian_day_number
-- explanation based on http://www.cs.utsa.edu/~cs1063/projects/Spring2011/Project1/project1.html
function p.date2jdn(ISOdate, gregorian)
year, month, day = ISOdate:match( "(%d%d%d%d)-(%d%d)-(%d%d)" )
if not year then
return nil
end
a = math.floor((14-month) / 12) -- will be 1 for January and February, and 0 for other months.
y = year + 4800 - a -- years since year –4800
m = month + 12*a - 3 -- month number where 10 for January, 11 for February, 0 for March, 1 for April
c = math.floor((153*m + 2)/5) -- number of days since March 1
d = 32045 -- offset so the result will be 0 for January 1, 4713 BCE
if gregorian>0 then
b = math.floor(y/4) - math.floor(y/100) + math.floor(y/400) -- number of leap years since y==0 (year –4800)
d = 32045 -- offset so the result will be 0 for January 1, 4713 BCE
else
b = math.floor(y/4) -- number of leap years since y==0 (year –4800)
d = 32083 -- offset so the result will be 0 for January 1, 4713 BCE
end
return day + c + 365*y + b - d
end
-- Convert a date from Gregorian to Julian calendar
function p.Gregorian2Julian(frame)
local JDN = p.date2jdn(frame.args[1], 1)
if JDN then
local year, month, day = p.jdn2date(JDN, 0)
return string.format('%04i-%02i-02i', year, month, day)
else
return "Error parsing input date: " .. frame.args[1]
end
end
-- Convert a date from Julian to Gregorian calendar
function p.Julian2Gregorian(frame)
local JDN = p.date2jdn(frame.args[1], 0)
if JDN then
local year, month, day = p.jdn2date(JDN, 1)
return string.format('%04i-%02i-02i', year, month, day)
else
return "Error parsing input date: " .. frame.args[1]
end
end
-- Return day of week based on gregorian date. Mon->1, Tue->2, ..., Sun->7
function p.DayOfWeek(frame)
local JDN = p.date2jdn(frame.args[1], 1)
local day = math.fmod(JDN, 7) + 1
if day then
local LUT = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }
return LUT[day]
else
return "Error parsing input date: " .. frame.args[1]
end
end
return p