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

[досмотренная версия][досмотренная версия]
Содержимое удалено Содержимое добавлено
м Текст ссылок
Нет описания правки
Строка 306:
local oh,om = parseISO8601Offset(str)
return tonumber(os.time({year=Y, month=M, day=D, hour=(h+oh), min=(m+om), sec=s}))
end
 
local seconds_in_day = 86400 -- = 24*60*60
 
local julBoundary1 = os.time({year = 1700, month = 3, day = 1, hour=0, min=0, sec=0})
local julBoundary2 = os.time({year = 1800, month = 3, day = 1, hour=0, min=0, sec=0})
local julBoundary3 = os.time({year = 1900, month = 3, day = 1, hour=0, min=0, sec=0})
 
--[[
Специальные даты:
+00000001700-02-29T00:00:00Z → 11.03.1700 (-8514374400)
+00000001800-02-29T00:00:00Z → 12.03.1800 (-5358614400)
+00000001900-02-29T00:00:00Z → 13.03.1900 (-2202854400)
 
Примеры:
+00000001709-06-27T00:00:00Z → 08.07.1709 (-8220096000)
+00000001825-12-14T00:00:00Z → 26.12.1825 (-4544726400)
+00000001917-10-25T00:00:00Z → 07.11.1917 (-1645747200)
]]
function s.parseISO8601_Julian(str)
assert(type(str) == "string");
local value = {} -- year=nil, month=nil, day=nil, hour=nil, min=nil, sec=nil
value.year, value.month, value.day = parseISO8601Date(str)
value.hour, value.min, value.sec = parseISO8601Time(str)
local offset_hour, offset_min = parseISO8601Offset(str)
value.hour = value.hour + offset_hour
value.min = value.min + offset_min
if value.year > 1582 and value.year < 1918 then
-- Обрабатываем специальные даты, которых нет в григорианском календаре:
-- 29.02.1700 => 11.03.1700
-- 29.02.1800 => 12.03.1800
-- 29.02.1900 => 13.03.1900
if value.day == 29 and value.month == 2 and value.year == 1700 then
value.day = 11
value.month = 3
elseif value.day == 29 and value.month == 2 and value.year == 1800 then
value.day = 12
value.month = 3
elseif value.day == 29 and value.month == 2 and value.year == 1900 then
value.day = 13
value.month = 3
else
local offset_day = 0
local time = os.time(value)
if time >= julBoundary3 then
offset_day = 13
elseif time >= julBoundary2 then
offset_day = 12
elseif time >= julBoundary1 then
offset_day = 11
else
offset_day = 10
end
return time + offset_day*seconds_in_day
end
end
return os.time(value)
end
 
--[[
Функция для тестирования:
* {{#invoke:Dates|test_parseISO8601_Julian|+00000001709-06-27T00:00:00Z}}<br/>27 июня (8 июля) 1709 (+11) — Полтавская битва
* {{#invoke:Dates|test_parseISO8601_Julian|+00000001825-12-14T00:00:00Z}}<br/>14 (26) декабря 1825 (+12) — Восстание декабристов
* {{#invoke:Dates|test_parseISO8601_Julian|+00000001917-10-25T00:00:00Z}}<br/>25 октября (7 ноября) 1917 (+13) — Октябрьская революция
]]
function s.test_parseISO8601_Julian(frame)
local s_iso_date = tostring(frame.args[1])
local result = s.parseISO8601_Julian(s_iso_date)
if result == nil then
return s_iso_date .. " → nil"
else
return s_iso_date .. " → " .. os.date("%d.%m.%Y", result) .. " (" .. tostring(result) ..")"
end
end