Module:BahaiDateTime
From Bahaipedia
local module = {}
local bahaiMonthsNames_map = {
[1] = {arabic = "Bahá", },
[2] = {arabic = "Jalál", },
[3] = {arabic = "Jamál", },
[4] = {arabic = "‘Aẓamat", },
[5] = {arabic = "Núr", },
[6] = {arabic = "Raḥmat", },
[7] = {arabic = "Kalimát", },
[8] = {arabic = "Kamál", },
[9] = {arabic = "Asmá’", },
[10] = {arabic = "‘Izzat", },
[11] = {arabic = "Mashíyyat", },
[12] = {arabic = "‘Ilm", },
[13] = {arabic = "Qudrat", },
[14] = {arabic = "Qawl", },
[15] = {arabic = "Masá’il", },
[16] = {arabic = "Sharaf", },
[17] = {arabic = "Sulṭán", },
[18] = {arabic = "Mulk", },
[19] = {arabic = "Ayyám-i-Há", },
[20] = {arabic = "‘Alá’", },
}
local newYears_map = {
[2015]=21 --[[March]],[2016]=20,[2017]=20,[2018]=21,[2019]=21,[2020]=20,[2021]=20,[2022]=21,[2023]=21,[2024]=20,[2025]=20,[2026]=21,[2027]=21,[2028]=20,[2029]=20,[2030]=20,[2031]=21,[2032]=20,[2033]=20,[2034]=20,[2035]=21,[2036]=20,[2037]=20,[2038]=20,[2039]=21,[2040]=20,[2041]=20,[2042]=20,[2043]=21,[2044]=20,[2045]=20,[2046]=20,[2047]=21,[2048]=20,[2049]=20,[2050]=20,[2051]=21,[2052]=20,[2053]=20,[2054]=20,[2055]=21,[2056]=20,[2057]=20,[2058]=20,[2059]=20,[2060]=20,[2061]=20,[2062]=20,[2063]=20,[2064]=20,
}
local interCalaryDays_map = {
[2016]=4,[2017]=4,[2018]=5,[2019]=4,[2020]=4,[2021]=4,[2022]=5,[2023]=4,[2024]=4,[2025]=4,[2026]=5,[2027]=4,[2028]=4,[2029]=4,[2030]=4,[2031]=5,[2032]=4,[2033]=4,[2034]=4,[2035]=5,[2036]=4,[2037]=4,[2038]=4,[2039]=5,[2040]=4,[2041]=4,[2042]=4,[2043]=5,[2044]=4,[2045]=4,[2046]=4,[2047]=5,[2048]=4,[2049]=4,[2050]=4,[2051]=5,[2052]=4,[2053]=4,[2054]=4,[2055]=5,[2056]=4,[2057]=4,[2058]=4,[2059]=4,[2060]=5,[2061]=4,[2062]=4,[2063]=4,[2064]=5,[2065]=4,
}
--Example: {year=gregorianYear, month=3, day=newYears_map[gregorianYear], hour=0, sec=1}
local function CreateDate(dateData)
local dateStamp = os.time(dateData)
return os.date("*t", dateStamp)
end
local function GregorianDateToBahaiDate(gregorianCurrentYear, gregorianCurrentMonth, gregorianCurrentDay)
local currentDate = CreateDate({year=gregorianCurrentYear, month=gregorianCurrentMonth, day=gregorianCurrentDay, hour=0, sec=1} )
--Assumption that it is already after new year
local newYearDate = CreateDate({year=gregorianCurrentYear, month=3, day=newYears_map[gregorianCurrentYear], hour=0, sec=1} )
local currentBahaiDayOfYear = currentDate.yday - newYearDate.yday + 1
local bahaiYear = gregorianCurrentYear - 1843
--Current Bahai year started in previous gregorian year
if currentDate.yday < newYearDate.yday then
bahaiYear = bahaiYear - 1
newYearDate = CreateDate({year=gregorianCurrentYear-1, month=3, day=newYears_map[gregorianCurrentYear-1], hour=0, sec=1} )
local lastDay = CreateDate({year=gregorianCurrentYear-1, month=12, day=31, hour=0, sec=1} ).yday
local bahaiDaysInPreviousGregorianYear = lastDay - newYearDate.yday
local bahaiDaysInCurrentGregorianYear = currentDate.yday
currentBahaiDayOfYear = bahaiDaysInPreviousGregorianYear + bahaiDaysInCurrentGregorianYear + 1
end
local bahaiDay = 0
local bahaiMonth = 19
local lastMonthDays
--Determining month
for month=1, 20 do
if month == 19 then
lastMonthDays = interCalaryDays_map[gregorianCurrentYear]
else
lastMonthDays = 19
end
bahaiDay = bahaiDay + lastMonthDays
if bahaiDay >= currentBahaiDayOfYear then
bahaiMonth = month
break
end
end
--Determining day of the month
local bahaiDayOfMonth = currentBahaiDayOfYear - (bahaiDay - lastMonthDays)
return {year = bahaiYear, month = bahaiMonth, day = bahaiDayOfMonth, yday = currentBahaiDayOfYear}
--return "CE: " .. currentDate.year .. "-" .. currentDate.month .. "-" .. currentDate.day .. " BE: Year:" .. bahaiYear .. " Month:"..bahaiMonth .. " (" .. bahaiMonthsNames_map[bahaiMonth].arabic..") Day:" .. bahaiDayOfMonth .. " Day of year:" .. currentBahaiDayOfYear
end
local function Frame2Date(frame)
local gregorianCurrentYear = tonumber(frame:getArgument(1):expand())
local gregorianCurrentMonth = tonumber(frame:getArgument(2):expand())
local gregorianCurrentDay = tonumber(frame:getArgument(3):expand())
return gregorianCurrentYear, gregorianCurrentMonth, gregorianCurrentDay
end
local function FormatBahaiDate(bahaiDate, formatName)
if formatName == "DayofMonth" then
return bahaiDate.day .. " " .. bahaiMonthsNames_map[bahaiDate.month].arabic
end
if formatName == "Year" then
return bahaiDate.year
end
if formatName == "FullDate" then
return bahaiDate.day .. " " .. bahaiMonthsNames_map[bahaiDate.month].arabic .. ", " .. bahaiDate.year
end
return "BE: Year:" .. bahaiDate.year .. " Month:"..bahaiDate.month .. " (" .. bahaiMonthsNames_map[bahaiDate.month].arabic..") Day:" .. bahaiDate.day .. " Day of year:" .. bahaiDate.yday
end
--Arguments: {{CURRENTYEAR}}|{{CURRENTMONTH1}}|{{CURRENTDAY}}
--Result: "18 ‘Alá’, 176"
function module.GregorianDateToBahaiDate(frame)
return FormatBahaiDate(GregorianDateToBahaiDate(Frame2Date(frame)) , "FullDate")
end
--Arguments: {{CURRENTYEAR}}|{{CURRENTMONTH1}}|{{CURRENTDAY}}
--Result: "18 ‘Alá’"
function module.GregorianDateToBahaiDayMonth(frame)
return FormatBahaiDate(GregorianDateToBahaiDate(Frame2Date(frame)) , "DayofMonth")
end
--Arguments: {{CURRENTYEAR}}|{{CURRENTMONTH1}}|{{CURRENTDAY}}
--Result: 176
function module.GregorianDateToBahaiYear(frame)
return FormatBahaiDate(GregorianDateToBahaiDate(Frame2Date(frame)) , "Year")
end
function module.DatesTest()
local dateStamp = os.time({year=2016, month=1, day=1, hour=0, sec=1})
local result = ""
for i=1, 4400 do
local date = os.date("*t", dateStamp)
local bahaiDate = GregorianDateToBahaiDate(date.year, date.month, date.day)
local bahaiDateText = "CE: " .. date.year .. "-" .. date.month .. "-" .. date.day .. " "
.. FormatBahaiDate(bahaiDate)
result = result .. bahaiDateText .. tostring(mw.html.create( 'div' ))
dateStamp = dateStamp + 86400
end
return result
end
--Returns current date time in in Bahai format. Arguments: requestedDateDype
local function GetFormattedCurrentBahaiDate(requestedDateDype)
local date = os.date("*t")
local bahaiDate = GregorianDateToBahaiDate(date.year, date.month, date.day)
return FormatBahaiDate(bahaiDate, requestedDateDype)
end
function module.DayofMonth()
return GetFormattedCurrentBahaiDate("DayofMonth")
end
function module.Year()
return GetFormattedCurrentBahaiDate("Year")
end
--[[
{{#invoke:BahaiDateTime|GregorianDateToBahaiDate|{{CURRENTYEAR}}|{{CURRENTMONTH1}}|{{CURRENTDAY}} }}
{{#invoke:BahaiDateTime|GregorianDateToBahaiDayMonth|{{CURRENTYEAR}}|{{CURRENTMONTH1}}|{{CURRENTDAY}} }}
{{#invoke:BahaiDateTime|GregorianDateToBahaiYear|{{CURRENTYEAR}}|{{CURRENTMONTH1}}|{{CURRENTDAY}} }}
]]
return module