Модуль:Calendar: различия между версиями

Материал из FetbukWiki
https://ru.wikipedia.org/wiki/>Carn
(отчего оно %x)
https://ru.wikipedia.org/wiki/>Carn
Нет описания правки
Строка 1: Строка 1:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local p = {}
local p = {}


function p.NthDay( frame )
function p.NthDay( frame )
-- копирование аргументов в локальную переменную
    -- копирование аргументов в локальную переменную
local args = getArgs(frame, { frameOnly = true })
    local args = getArgs(frame, { frameOnly = true })
-- таблица для перевода логической переменной в число
    -- таблица для перевода логической переменной в число
local bool_to_number={ [true]=1, [false]=0 }  
    local bool_to_number={ [true]=1, [false]=0 }
-- записывание переменных для использования в программе
    -- записывание переменных для использования в программе
-- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
    -- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
local num = math.floor(tonumber(args[1]))  
    local num = math.floor(tonumber(args[1]))  
-- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
    -- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
local wday = math.floor(tonumber(args[2]))  
    local wday = math.floor(tonumber(args[2]))  
-- месяц, для которого делается расчёт
    -- месяц, для которого делается расчёт
local mont = math.floor(tonumber(args[3]))  
    local mont = math.floor(tonumber(args[3]))  
-- год, для которого делается расчёт
    -- год, для которого делается расчёт
local yea = math.floor(tonumber(args[4]))  
    local yea = math.floor(tonumber(args[4]))  
-- проверка переменных на допустимость использования
    -- проверка переменных на допустимость использования
local err = "---"
    local err = "---"
if num < -5 or num > 5 then  
    if num < -5 or num > 5 then  
error("The number must be between -5 and 5")
        error("The number must be between -5 and 5")
elseif num == 0 then
    elseif num == 0 then
error("The number must not be zero")
        error("The number must not be zero")
end
    end
if wday < 0 or wday > 6 then  
    if wday < 0 or wday > 6 then  
error("The day of the week must be between 0 and 6") end
        error("The day of the week must be between 0 and 6") end
if mont < 0 or mont > 12 then  
    if mont < 0 or mont > 12 then  
error("The month must be between 1 and 12") end
        error("The month must be between 1 and 12") end
if yea < 0 or yea > 9999 then  
    if yea < 0 or yea > 9999 then  
error("Wrong year number") end
        error("Wrong year number") end
-- ветка расчётов с начала
    -- ветка расчётов с начала
if num > 0 and num < 6 then
    if num > 0 and num < 6 then
-- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
        -- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
-- получение дня недели  
        -- получение дня недели  
local m_wds = tonumber(os.date("%w", m_start))
        local m_wds = tonumber(os.date("%w", m_start))
-- расчёт сдвига в днях и перевод в секунды   
        -- расчёт сдвига в днях и перевод в секунды   
local start_shift = (
        local start_shift = (
(num - bool_to_number[wday >= m_wds]) * 7  
            (num - bool_to_number[wday >= m_wds]) * 7  
- (m_wds - wday)
            - (m_wds - wday)
) * 24 * 60 * 60
            ) * 24 * 60 * 60
local tim = m_start + start_shift
        local tim = m_start + start_shift
-- вывод результата в необходимом формате даты
        -- вывод результата в необходимом формате даты
if tonumber(os.date("%m", tim)) == mont then
        if tonumber(os.date("%m", tim)) == mont then
return (os.date("%d.%m.%y", tim))
            return (os.date("%d.%m.%y", tim))
else
        else
return (err)
            return (err)
end
        end
-- ветка расчётов с конца
    -- ветка расчётов с конца
elseif num < 0 and num > -6 then
    elseif num < 0 and num > -6 then
-- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
        -- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
local m_end = os.time{year = yea,  
        local m_end = os.time{year = yea,  
month = mont + 1, day = 1, hour = 0}  
            month = mont + 1, day = 1, hour = 0}  
- 24 * 60 * 60
            - 24 * 60 * 60
-- получение дня недели конца месяца
        -- получение дня недели конца месяца
local m_wde = tonumber(os.date("%w", m_end))
        local m_wde = tonumber(os.date("%w", m_end))
-- расчёт сдвига в днях и перевод в секунды
        -- расчёт сдвига в днях и перевод в секунды
local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7  
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7  
+ (m_wde - wday)) * 24 * 60 * 60
            + (m_wde - wday)) * 24 * 60 * 60
local tim = m_end - end_shift
        local tim = m_end - end_shift
if tonumber(os.date("%m", tim)) == mont then
        if tonumber(os.date("%m", tim)) == mont then
return (os.date("%d.%m.%y", tim))
            return (os.date("%d.%m.%y", tim))
else
        else
return (err)
            return (err)
end
        end
end
    end
end
end


function p.NthDayIso( frame )
function p.NthDayIso( frame )
-- копирование аргументов в локальную переменную
    -- копирование аргументов в локальную переменную
local args = getArgs(frame, { frameOnly = true })
    local args = getArgs(frame, { frameOnly = true })
-- таблица для перевода логической переменной в число
    -- таблица для перевода логической переменной в число
local bool_to_number={ [true]=1, [false]=0 }  
    local bool_to_number={ [true]=1, [false]=0 }  
-- таблица для вывода дат в формате, позволяющем поставить на них вики-ссылку
    -- таблица для вывода дат в формате, позволяющем поставить на них вики-ссылку
local ru_month = {  
    local ru_month = {  
[1]="января",  
        [1]="января",  
[2]="февраля",
        [2]="февраля",
[3]="марта",
        [3]="марта",
[4]="апреля",
        [4]="апреля",
[5]="мая",
        [5]="мая",
[6]="июня",
        [6]="июня",
[7]="июля",
        [7]="июля",
[8]="августа",
        [8]="августа",
[9]="сентября",
        [9]="сентября",
[10]="октября",
        [10]="октября",
[11]="ноября",
        [11]="ноября",
[12]="декабря" }
        [12]="декабря" }
-- записывание переменных для использования в программе
    -- записывание переменных для использования в программе
-- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
    -- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
local num = math.floor(tonumber(args[1]))  
    local num = math.floor(tonumber(args[1]))  
-- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
    -- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
local wday = math.floor(tonumber(args[2]))  
    local wday = math.floor(tonumber(args[2]))  
-- месяц, для которого делается расчёт
    -- месяц, для которого делается расчёт
local mont = math.floor(tonumber(args[3]))  
    local mont = math.floor(tonumber(args[3]))  
-- год, для которого делается расчёт
    -- год, для которого делается расчёт
local yea = math.floor(tonumber(args[4]))  
    local yea = math.floor(tonumber(args[4]))  
-- проверка переменных на допустимость использования
    -- проверка переменных на допустимость использования
local err = "---"
    local err = "---"
if num < -5 or num > 5 then  
    if num < -5 or num > 5 then  
error("The number must be between -5 and 5")
        error("The number must be between -5 and 5")
elseif num == 0 then
    elseif num == 0 then
error("The number must not be zero")
        error("The number must not be zero")
end
    end
if wday < 0 or wday > 6 then  
    if wday < 0 or wday > 6 then  
error("The day of the week must be between 0 and 6") end
        error("The day of the week must be between 0 and 6") end
if mont < 0 or mont > 12 then  
    if mont < 0 or mont > 12 then  
error("The month must be between 1 and 12") end
        error("The month must be between 1 and 12") end
if yea < 0 or yea > 9999 then  
    if yea < 0 or yea > 9999 then  
error("Wrong year number") end
        error("Wrong year number") end
-- ветка расчётов с начала
    -- ветка расчётов с начала
if num > 0 and num < 6 then
    if num > 0 and num < 6 then
-- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
        -- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
-- получение дня недели  
        -- получение дня недели  
local m_wds = tonumber(os.date("%w", m_start))
        local m_wds = tonumber(os.date("%w", m_start))
-- расчёт сдвига в днях и перевод в секунды   
        -- расчёт сдвига в днях и перевод в секунды   
local start_shift = (
        local start_shift = (
(num - bool_to_number[wday >= m_wds]) * 7  
            (num - bool_to_number[wday >= m_wds]) * 7  
- (m_wds - wday)
            - (m_wds - wday)
) * 24 * 60 * 60
            ) * 24 * 60 * 60
local tim = m_start + start_shift
        local tim = m_start + start_shift
local tex = tonumber(os.date("%d", tim)) .. " " .. ru_month[mont]
        local tex = tonumber(os.date("%d", tim)) .. " " .. ru_month[mont]
-- вывод результата в необходимом формате даты
        -- вывод результата в необходимом формате даты
if tonumber(os.date("%m", tim)) == mont then
        if tonumber(os.date("%m", tim)) == mont then
return (tex)
            return (tex)
else
        else
return (err)
            return (err)
end
        end
-- ветка расчётов с конца
    -- ветка расчётов с конца
elseif num < 0 and num > -6 then
    elseif num < 0 and num > -6 then
-- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
        -- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
local m_end = os.time{year = yea,  
        local m_end = os.time{year = yea,  
month = mont + 1, day = 1, hour = 0}  
            month = mont + 1, day = 1, hour = 0}  
- 24 * 60 * 60
            - 24 * 60 * 60
-- получение дня недели конца месяца
        -- получение дня недели конца месяца
local m_wde = tonumber(os.date("%w", m_end))
        local m_wde = tonumber(os.date("%w", m_end))
-- расчёт сдвига в днях и перевод в секунды
        -- расчёт сдвига в днях и перевод в секунды
local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7  
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7  
+ (m_wde - wday)) * 24 * 60 * 60
            + (m_wde - wday)) * 24 * 60 * 60
local tim = m_end - end_shift
        local tim = m_end - end_shift
local tex = tonumber(os.date("%d", tim)) .. " " .. ru_month[mont]
        local tex = tonumber(os.date("%d", tim)) .. " " .. ru_month[mont]
if tonumber(os.date("%m", tim)) == mont then
        if tonumber(os.date("%m", tim)) == mont then
return (tex)
            return (tex)
else
        else
return (err)
            return (err)
end
        end
end
    end
end
end


function p.NthDayF( frame )
function p.NthDayF( frame )
-- копирование аргументов в локальную переменную
    -- копирование аргументов в локальную переменную
local args = getArgs(frame, { frameOnly = true })
    local args = getArgs(frame, { frameOnly = true })
-- таблица для перевода логической переменной в число
    -- таблица для перевода логической переменной в число
local bool_to_number={ [true]=1, [false]=0 }  
    local bool_to_number={ [true]=1, [false]=0 }  
-- записывание переменных для использования в программе
    -- записывание переменных для использования в программе
-- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
    -- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
local num = math.floor(tonumber(args[1]))  
    local num = math.floor(tonumber(args[1]))  
-- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
    -- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
local wday = math.floor(tonumber(args[2]))  
    local wday = math.floor(tonumber(args[2]))  
-- месяц, для которого делается расчёт
    -- месяц, для которого делается расчёт
local mont = math.floor(tonumber(args[3]))  
    local mont = math.floor(tonumber(args[3]))  
-- год, для которого делается расчёт
    -- год, для которого делается расчёт
local yea = math.floor(tonumber(args[4]))  
    local yea = math.floor(tonumber(args[4]))  
-- проверка переменных на допустимость использования
    -- проверка переменных на допустимость использования
     local forma = args[5]
     local format = args[5]
     if not forma then forma = "%d.%m.%y" end
     if not args[5] then format = "%d.%m.%y" end
     error(forma)
     error(format)
local err = "---"
    local err = "---"
if num < -5 or num > 5 then  
    if num < -5 or num > 5 then  
error("The number must be between -5 and 5")
        error("The number must be between -5 and 5")
elseif num == 0 then
    elseif num == 0 then
error("The number must not be zero")
        error("The number must not be zero")
end
    end
if wday < 0 or wday > 6 then  
    if wday < 0 or wday > 6 then  
error("The day of the week must be between 0 and 6") end
        error("The day of the week must be between 0 and 6") end
if mont < 0 or mont > 12 then  
    if mont < 0 or mont > 12 then  
error("The month must be between 1 and 12") end
        error("The month must be between 1 and 12") end
if yea < 0 or yea > 9999 then  
    if yea < 0 or yea > 9999 then  
error("Wrong year number") end
        error("Wrong year number") end
-- ветка расчётов с начала
    -- ветка расчётов с начала
if num > 0 and num < 6 then
    if num > 0 and num < 6 then
-- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
        -- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
-- получение дня недели  
        -- получение дня недели  
local m_wds = tonumber(os.date("%w", m_start))
        local m_wds = tonumber(os.date("%w", m_start))
-- расчёт сдвига в днях и перевод в секунды   
        -- расчёт сдвига в днях и перевод в секунды   
local start_shift = (
        local start_shift = (
(num - bool_to_number[wday >= m_wds]) * 7  
            (num - bool_to_number[wday >= m_wds]) * 7  
- (m_wds - wday)
            - (m_wds - wday)
) * 24 * 60 * 60
            ) * 24 * 60 * 60
local tim = m_start + start_shift
        local tim = m_start + start_shift
-- вывод результата в необходимом формате даты
        -- вывод результата в необходимом формате даты
if tonumber(os.date("%m", tim)) == mont then
        if tonumber(os.date("%m", tim)) == mont then
return (os.date(forma, tim))
            return (os.date(format, tim))
else
        else
return (err)
            return (err)
end
        end
-- ветка расчётов с конца
    -- ветка расчётов с конца
elseif num < 0 and num > -6 then
    elseif num < 0 and num > -6 then
-- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
        -- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
local m_end = os.time{year = yea,  
        local m_end = os.time{year = yea,  
month = mont + 1, day = 1, hour = 0}  
            month = mont + 1, day = 1, hour = 0}  
- 24 * 60 * 60
            - 24 * 60 * 60
-- получение дня недели конца месяца
        -- получение дня недели конца месяца
local m_wde = tonumber(os.date("%w", m_end))
        local m_wde = tonumber(os.date("%w", m_end))
-- расчёт сдвига в днях и перевод в секунды
        -- расчёт сдвига в днях и перевод в секунды
local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7  
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7  
+ (m_wde - wday)) * 24 * 60 * 60
            + (m_wde - wday)) * 24 * 60 * 60
local tim = m_end - end_shift
        local tim = m_end - end_shift
if tonumber(os.date("%m", tim)) == mont then
        if tonumber(os.date("%m", tim)) == mont then
return (os.date(forma, tim))
            return (os.date(format, tim))
else
        else
return (err)
            return (err)
end
        end
end
    end
end
end


return p
return p

Версия от 13:46, 25 ноября 2019

Функции

Находится в бета-версии (11 839 байт). Об ошибках просьба сообщать на страницу обсуждения шаблона или самого модуля, или Carn. Если вы хотите поэкспериментировать, лучше делать это в альфа-версии (30 288 байт).

NthDay

{{ДатыСтрокой}}, {{Даты}}

  • Получает 4 числовых аргумента, считает дату и выдаёт её в формате пятого, необязательного аргумента. Примеры использования (значения аргументов в скобках):
    • первое (1) воскресенье (0) октября (10) (2020) года ={{#invoke:Calendar|NthDay|1|0|10|2020}}= 04.10.20
    • вторая (2) среда (3) мая (5) (2019) года ={{#invoke:Calendar|NthDay|2|3|5|2019}}= 08.05.19
    • последний (-1) понедельник (1) января (1) (2010) года ={{#invoke:Calendar|NthDay|-1|1|1|2010}}= 25.01.10
    • предпоследняя (-2) суббота (6) декабря (12) (2001) года ={{#invoke:Calendar|NthDay|-2|6|12|2001}}= 22.12.01
    • третье (3) воскресенье (0) марта (3) (2024) года в формате ISO 8601={{#invoke:Calendar|NthDay|3|0|3|2024|%Y-%m-%d}}= 17.03.24

unitime

{{НП/Формат времени}}

  • Оформляет ссылку на UTC, если есть любой второй параметр — ставит летнее время
    • {{#invoke:Calendar|unitime|-0}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|+0}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|+2:00}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|−3:30|}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|+12:45|1}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|-3:30|да}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|CET}} = Ошибка скрипта: Функции «unitime» не существует.
    • {{#invoke:Calendar|unitime|EST|no}} = Ошибка скрипта: Функции «unitime» не существует.

OldDate

устарело

  • Два обязательных аргумента, первый из которых — дата в формате ДД.ММ.ГГГГ или Д. М.ГГГГ, второй — григорианский/юлианский календарь, «г» или «ю»
  • Необязательные аргументы bc (до нашей эры), а также параметры викификации wd, wm и wy, связанные, соответственно с вифификацией дня, месяца и года
  • Можно использовать параметр sq_brts для использования квадратных скобок и параметр yearmark для нестандартного обозначения года
    • {{#invoke:Calendar|OldDate|1.1.1|ю|wd=1}} = Ошибка скрипта: Функции «OldDate» не существует. ошибка!
    • {{#invoke:Calendar|OldDate|31.12.1|г|bc=1}} = Ошибка Lua: bad argument #2 to 'formatDate' (not a valid timestamp).
    • {{#invoke:Calendar|OldDate|{{#time: d.m.Y }}|г}} = Ошибка скрипта: Функции «OldDate» не существует.
    • {{#invoke:Calendar|OldDate|11.2.1602|j|wd=1|wm=0|wy=1}} = Ошибка скрипта: Функции «OldDate» не существует.
    • {{#invoke:Calendar|OldDate|11.2.1602|j|wd=1|wm=1|wy=1}} = Ошибка скрипта: Функции «OldDate» не существует.
    • {{#invoke:Calendar|OldDate|11.2.1602|g|bc=1|yearmark=г.}} = Ошибка скрипта: Функции «OldDate» не существует.
    • {{#invoke:Calendar|OldDate|11.2.1602|g|sq_brts=1|yearmark=0}} = Ошибка скрипта: Функции «OldDate» не существует.

NewDate

{{DateStyle}}

  • Аналогично функции выше, но может обрабатывать отрицательные даты и принимает жёстко только 2 формата d.m.y и y-m-d
    • {{#invoke:Calendar|NewDate|1.1.1|ю|wd=1}} = Ошибка скрипта: Функции «NewDate» не существует.
    • {{#invoke:Calendar|NewDate|31.12.1|г|bc=1}} = Ошибка скрипта: Функции «NewDate» не существует.
    • {{#invoke:Calendar|NewDate|{{#time: d.m.Y }}}} = Ошибка скрипта: Функции «NewDate» не существует. (по умолчанию григорианский)
    • {{#invoke:Calendar|NewDate|11.2.1602|j|wd=1|wm=0|wy=1}} = Ошибка скрипта: Функции «NewDate» не существует.
    • {{#invoke:Calendar|NewDate|11.2.1602|j|wd=1|wm=1|wy=1}} = Ошибка скрипта: Функции «NewDate» не существует.
    • {{#invoke:Calendar|NewDate|11.2.1602|g|bc=1|yearmark=г.}} = Ошибка скрипта: Функции «NewDate» не существует.
    • {{#invoke:Calendar|NewDate|11.2.1602|g|sq_brts=1|yearmark=0}} = Ошибка скрипта: Функции «NewDate» не существует.

ToIso

  • Получает полную дату дату в форматах с четырёхзначным годом и выдаёт дату в формате ГГГГ-ММ-ДД
    • 1.2.1602 ={{#invoke:Calendar|ToIso|1.2.1602}}= Ошибка скрипта: Функции «ToIso» не существует.
    • -2020-12-12 ={{#invoke:Calendar|ToIso|-2020-12-12}}= Ошибка скрипта: Функции «ToIso» не существует.
    • 5 января 1002 ={{#invoke:Calendar|ToIso|5 января 1002}}= Ошибка скрипта: Функции «ToIso» не существует.

BoxDate

  • Получает дату с четырёхзначным годом, месяцем и опционально днём месяца, выдаёт читаемую
    • 06.1280 ={{#invoke:Calendar|BoxDate|06.1280}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • 1820-07 ={{#invoke:Calendar|BoxDate|1820-07}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • 2020-12, xg Y = {{#invoke:Calendar|BoxDate|2020-12|xg Y}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • 08.08.1828 ={{#invoke:Calendar|BoxDate|08.08.1828}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • July 12, 2020 ={{#invoke:Calendar|BoxDate|Jule 12, 2020}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • 12 July 2020 ={{#invoke:Calendar|BoxDate|12 Jule 2020}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • July 2020 ={{#invoke:Calendar|BoxDate|Jule 2020}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • 13 août 1281, l W недели Y года ={{#invoke:Calendar|BoxDate|13 août 1281|l W недели Y года}}= Ошибка скрипта: Функции «BoxDate» не существует.
    • 13 января ={{#invoke:Calendar|BoxDate|13 января}}= Ошибка скрипта: Функции «BoxDate» не существует.
bxDate

Реализует указанные выше функции для вызова из других модулей (см. пример использования в Message box), todo:

  • поддержка отрицательных лет (запоминание знака, обработка в положительном виде, приделывание "до н.э." в конце; 0000-01-01 невалидно)
  • преобразование даты в ISO формат, получение строки форматирования и преобразование по ней (необходимы доп.проверки для неточных дат)
  • отдавать параметры errorText и errorCat

ToDate

  • Получает дату в формате Википедия:Функции парсера##time и возвращает в формате <число> <месяц в родительном падеже> <год>
  • Если в строке нету символов препинания, то возвращает её неизменённой
    • 1.2.1602 ={{#invoke:Calendar|ToDate|1.2.1602}}= Ошибка скрипта: Функции «ToDate» не существует.
    • 1/2/1602 ={{#invoke:Calendar|ToDate|1/2/1602}}= Ошибка скрипта: Функции «ToDate» не существует.
    • 1602-02-01 ={{#invoke:Calendar|ToDate|1602-02-01}}= Ошибка скрипта: Функции «ToDate» не существует.
    • 1 февраля 1602 ={{#invoke:Calendar|ToDate|1 февраля 1602}}= Ошибка скрипта: Функции «ToDate» не существует.
    • Завтра (+ 1 day) ={{#invoke:Calendar|ToDate|+ 1 day}}= Ошибка скрипта: Функции «ToDate» не существует.

local getArgs = require('Module:Arguments').getArgs
local p = {}

function p.NthDay( frame )
    -- копирование аргументов в локальную переменную
    local args = getArgs(frame, { frameOnly = true })
    -- таблица для перевода логической переменной в число
    local bool_to_number={ [true]=1, [false]=0 }
    -- записывание переменных для использования в программе
    -- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
    local num = math.floor(tonumber(args[1])) 
    -- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
    local wday = math.floor(tonumber(args[2])) 
    -- месяц, для которого делается расчёт
    local mont = math.floor(tonumber(args[3])) 
    -- год, для которого делается расчёт
    local yea = math.floor(tonumber(args[4])) 
    -- проверка переменных на допустимость использования
    local err = "---"
    if num < -5 or num > 5 then 
        error("The number must be between -5 and 5")
    elseif num == 0 then
        error("The number must not be zero")
    end
    if wday < 0 or wday > 6 then 
        error("The day of the week must be between 0 and 6") end
    if mont < 0 or mont > 12 then 
        error("The month must be between 1 and 12") end
    if yea < 0 or yea > 9999 then 
        error("Wrong year number") end
    -- ветка расчётов с начала
    if num > 0 and num < 6 then
        -- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        -- получение дня недели 
        local m_wds = tonumber(os.date("%w", m_start))
        -- расчёт сдвига в днях и перевод в секунды   
        local start_shift = (
            (num - bool_to_number[wday >= m_wds]) * 7 
            - (m_wds - wday)
            ) * 24 * 60 * 60
        local tim = m_start + start_shift
        -- вывод результата в необходимом формате даты
        if tonumber(os.date("%m", tim)) == mont then
            return (os.date("%d.%m.%y", tim))
        else
            return (err)
        end
    -- ветка расчётов с конца
    elseif num < 0 and num > -6 then
        -- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
        local m_end = os.time{year = yea, 
            month = mont + 1, day = 1, hour = 0} 
            - 24 * 60 * 60
        -- получение дня недели конца месяца
        local m_wde = tonumber(os.date("%w", m_end))
        -- расчёт сдвига в днях и перевод в секунды
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7 
            + (m_wde - wday)) * 24 * 60 * 60
        local tim = m_end - end_shift
        if tonumber(os.date("%m", tim)) == mont then
            return (os.date("%d.%m.%y", tim))
        else
            return (err)
        end
    end
end

function p.NthDayIso( frame )
    -- копирование аргументов в локальную переменную
    local args = getArgs(frame, { frameOnly = true })
    -- таблица для перевода логической переменной в число
    local bool_to_number={ [true]=1, [false]=0 } 
    -- таблица для вывода дат в формате, позволяющем поставить на них вики-ссылку
    local ru_month = { 
        [1]="января", 
        [2]="февраля",
        [3]="марта",
        [4]="апреля",
        [5]="мая",
        [6]="июня",
        [7]="июля",
        [8]="августа",
        [9]="сентября",
        [10]="октября",
        [11]="ноября",
        [12]="декабря" }
    -- записывание переменных для использования в программе
    -- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
    local num = math.floor(tonumber(args[1])) 
    -- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
    local wday = math.floor(tonumber(args[2])) 
    -- месяц, для которого делается расчёт
    local mont = math.floor(tonumber(args[3])) 
    -- год, для которого делается расчёт
    local yea = math.floor(tonumber(args[4])) 
    -- проверка переменных на допустимость использования
    local err = "---"
    if num < -5 or num > 5 then 
        error("The number must be between -5 and 5")
    elseif num == 0 then
        error("The number must not be zero")
    end
    if wday < 0 or wday > 6 then 
        error("The day of the week must be between 0 and 6") end
    if mont < 0 or mont > 12 then 
        error("The month must be between 1 and 12") end
    if yea < 0 or yea > 9999 then 
        error("Wrong year number") end
    -- ветка расчётов с начала
    if num > 0 and num < 6 then
        -- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        -- получение дня недели 
        local m_wds = tonumber(os.date("%w", m_start))
        -- расчёт сдвига в днях и перевод в секунды   
        local start_shift = (
            (num - bool_to_number[wday >= m_wds]) * 7 
            - (m_wds - wday)
            ) * 24 * 60 * 60
        local tim = m_start + start_shift
        local tex = tonumber(os.date("%d", tim)) .. " " .. ru_month[mont]
        -- вывод результата в необходимом формате даты
        if tonumber(os.date("%m", tim)) == mont then
            return (tex)
        else
            return (err)
        end
    -- ветка расчётов с конца
    elseif num < 0 and num > -6 then
        -- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
        local m_end = os.time{year = yea, 
            month = mont + 1, day = 1, hour = 0} 
            - 24 * 60 * 60
        -- получение дня недели конца месяца
        local m_wde = tonumber(os.date("%w", m_end))
        -- расчёт сдвига в днях и перевод в секунды
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7 
            + (m_wde - wday)) * 24 * 60 * 60
        local tim = m_end - end_shift
        local tex = tonumber(os.date("%d", tim)) .. " " .. ru_month[mont]
        if tonumber(os.date("%m", tim)) == mont then
            return (tex)
        else
            return (err)
        end
    end
end

function p.NthDayF( frame )
    -- копирование аргументов в локальную переменную
    local args = getArgs(frame, { frameOnly = true })
    -- таблица для перевода логической переменной в число
    local bool_to_number={ [true]=1, [false]=0 } 
    -- записывание переменных для использования в программе
    -- день недели в месяце по порядку, к примеру - ''первая/вторая/третья'' суббота месяца
    local num = math.floor(tonumber(args[1])) 
    -- день недели, который нужно получить в формате 0 это воскресенье, 6 это суббота
    local wday = math.floor(tonumber(args[2])) 
    -- месяц, для которого делается расчёт
    local mont = math.floor(tonumber(args[3])) 
    -- год, для которого делается расчёт
    local yea = math.floor(tonumber(args[4])) 
    -- проверка переменных на допустимость использования
    local format = args[5]
    if not args[5] then format = "%d.%m.%y" end
    error(format)
    local err = "---"
    if num < -5 or num > 5 then 
        error("The number must be between -5 and 5")
    elseif num == 0 then
        error("The number must not be zero")
    end
    if wday < 0 or wday > 6 then 
        error("The day of the week must be between 0 and 6") end
    if mont < 0 or mont > 12 then 
        error("The month must be between 1 and 12") end
    if yea < 0 or yea > 9999 then 
        error("Wrong year number") end
    -- ветка расчётов с начала
    if num > 0 and num < 6 then
        -- получение значения в секундах для первого числа месяца, от которого идёт отсчёт
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        -- получение дня недели 
        local m_wds = tonumber(os.date("%w", m_start))
        -- расчёт сдвига в днях и перевод в секунды   
        local start_shift = (
            (num - bool_to_number[wday >= m_wds]) * 7 
            - (m_wds - wday)
            ) * 24 * 60 * 60
        local tim = m_start + start_shift
        -- вывод результата в необходимом формате даты
        if tonumber(os.date("%m", tim)) == mont then
            return (os.date(format, tim))
        else
            return (err)
        end
    -- ветка расчётов с конца
    elseif num < 0 and num > -6 then
        -- получение значения в секундах для последнего числа месяца, от которого идёт отсчёт
        local m_end = os.time{year = yea, 
            month = mont + 1, day = 1, hour = 0} 
            - 24 * 60 * 60
        -- получение дня недели конца месяца
        local m_wde = tonumber(os.date("%w", m_end))
        -- расчёт сдвига в днях и перевод в секунды
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7 
            + (m_wde - wday)) * 24 * 60 * 60
        local tim = m_end - end_shift
        if tonumber(os.date("%m", tim)) == mont then
            return (os.date(format, tim))
        else
            return (err)
        end
    end
end


return p

-- %a   abbreviated weekday name (e.g., Wed)
-- %A   full weekday name (e.g., Wednesday)
-- %b   abbreviated month name (e.g., Sep)
-- %B   full month name (e.g., September)
-- %c   date and time (e.g., 09/16/98 23:48:10)
-- %d   day of the month (16) [01-31]
-- %H   hour, using a 24-hour clock (23) [00-23]
-- %I   hour, using a 12-hour clock (11) [01-12]
-- %M   minute (48) [00-59]
-- %m   month (09) [01-12]
-- %p   either "am" or "pm" (pm)
-- %S   second (10) [00-61]
-- %w   weekday (3) '''[0-6 = Sunday-Saturday]'''
-- %x   date (e.g., 09/16/98)
-- %X   time (e.g., 23:48:10)
-- %Y   full year (1998)
-- %y   two-digit year (98) [00-99]
-- %%   the character `%´