יחידה:תאריך: הבדלים בין גרסאות בדף
מאין תקציר עריכה |
מ המרות |
||
| שורה 1: | שורה 1: | ||
local Date = {} | local Date = {} | ||
local maxDaysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} | |||
--Internal functions | --Internal functions | ||
| שורה 199: | שורה 200: | ||
return ((year % 4) == 0) and | return ((year % 4) == 0) and | ||
(not (((year % 100) == 0) and ((year % 400) ~= 0))) | (not (((year % 100) == 0) and ((year % 400) ~= 0))) | ||
end | |||
local isDateInLeapYear = function(indate) | |||
if indate.calendar == Date.CALENDAR.JULIAN then | |||
return 0 == indate.year % 4 | |||
end | |||
return leapGregorian(indate.year) | |||
end | end | ||
| שורה 245: | שורה 253: | ||
return year, month, day | return year, month, day | ||
end | |||
-- adapted from ro:Modul:GregorianDate | |||
local initialOffset = -3 | |||
local limitDates = { | |||
{year = 4, month = 3, day = 3, calendar = 'julian' }, | |||
{year = 100, month = 3, day = 2, calendar = 'julian' }, | |||
{year = 200, month = 3, day = 1, calendar = 'julian' }, | |||
{year = 300, month = 2, day = 29, calendar = 'julian' }, | |||
{year = 500, month = 2, day = 28, calendar = 'julian' }, | |||
{year = 600, month = 2, day = 27, calendar = 'julian' }, | |||
{year = 700, month = 2, day = 26, calendar = 'julian' }, | |||
{year = 900, month = 2, day = 25, calendar = 'julian' }, | |||
{year = 1000, month = 2, day = 24, calendar = 'julian' }, | |||
{year = 1100, month = 2, day = 23, calendar = 'julian' }, | |||
{year = 1300, month = 2, day = 22, calendar = 'julian' }, | |||
{year = 1400, month = 2, day = 21, calendar = 'julian' }, | |||
{year = 1500, month = 2, day = 20, calendar = 'julian' }, | |||
{year = 1700, month = 2, day = 19, calendar = 'julian' }, | |||
{year = 1800, month = 2, day = 18, calendar = 'julian' }, | |||
{year = 1900, month = 2, day = 17, calendar = 'julian' }, | |||
{year = 2100, month = 2, day = 16, calendar = 'julian' }, | |||
{year = 2200, month = 2, day = 15, calendar = 'julian' }, | |||
{year = 2300, month = 2, day = 14, calendar = 'julian' } | |||
} | |||
function Date.julianToGregorian(indate) | |||
if indate.calendar ~= Date.CALENDAR.JULIAN then | |||
return indate | |||
end | |||
local offset = initialOffset | |||
local limitDateIdx = 1 | |||
while limitDateIdx < #limitDates and le(limitDates[limitDateIdx], indate) do | |||
limitDateIdx = limitDateIdx + 1 | |||
offset = offset + 1 | |||
end | |||
local outputDate = Date.addDaysToDate(indate, offset) | |||
outputDate.calendar = Date.CALENDAR.GREGORIAN | |||
outputDate.calendarmodel = 'http://www.wikidata.org/entity/Q1985727' | |||
return Date.new(outputDate) | |||
end | |||
function Date.addDaysToDate(indate, days) | |||
local outdate = mw.clone(indate) | |||
outdate.day = outdate.day + days | |||
local lastDayOfMonth = maxDaysInMonth[outdate.month] | |||
while outdate.day > lastDayOfMonth do | |||
lastDayOfMonth = maxDaysInMonth[outdate.month] | |||
if outdate.month == 2 and isDateInLeapYear(outdate) then lastDayOfMonth = 29 end | |||
outdate.month = outdate.month + 1 | |||
outdate.day = outdate.day - lastDayOfMonth | |||
end | |||
while outdate.month > 12 do | |||
outdate.year = outdate.year + 1 | |||
outdate.month = outdate.month - 12 | |||
end | |||
return outdate | |||
end | end | ||