Lua ISO 8601 шаблон синтаксического анализа datetime

Я пытаюсь разобрать полную дату и время ISO8601 из JSON данные в Lua. У меня проблемы с шаблоном соответствия.

Пока что у меня вот что:

-- Example datetime string 2011-10-25T00:29:55.503-04:00
local datetime = "2011-10-25T00:29:55.503-04:00"
local pattern = "(%d+)%-(%d+)%-(%d+)T(%d+):(%d+):(%d+)%.(%d+)"
local xyear, xmonth, xday, xhour, xminute, 
        xseconds, xmillies, xoffset = datetime:match(pattern)

local convertedTimestamp = os.time({year = xyear, month = xmonth, 
        day = xday, hour = xhour, min = xminute, sec = xseconds})

Я застрял в том, как работать с часовым поясом в шаблоне, потому что нет логического или, что бы обрабатывать - или +, или ничего. Хотя я знаю, что lua не поддерживает часовой пояс в операционной системе.функция времени, по крайней мере, я бы знал, как ее нужно настраивать.

Я подумал о том, чтобы убрать все, что находится после "." (миллисекунды и часовой пояс), но тогда у меня действительно не было бы действительной даты и времени. Миллисекунды не так уж и важны, и я был бы не против их потерять, но часовой пояс все меняет.

Примечание: у кого-то может быть гораздо лучший код для этого, и я не женат на нем, мне просто нужно извлечь что-то полезное из строки даты и времени :)

9
задан Brill Pappin 27 October 2011 в 03:08
поделиться

1 ответ

Вот простое parseDate функция для дат ISO. Обратите внимание, что я использую "теперь" в качестве нейтрализации. Это может или не может работать на Вас. YMMV 🠘 ‰.

--[[
    Parse date given in any of supported forms.

    Note! For unrecognised format will return now.

    @param str ISO date. Formats:
        Y-m-d
        Y-m -- this will assume January
        Y -- this will assume 1st January
]]
function parseDate(str)
    local y, m, d = str:match("(%d%d%d%d)-?(%d?%d?)-?(%d?%d?)$")
    -- fallback to now
    if y == nil then
        return os.time()
    end
    -- defaults
    if m == '' then
        m = 1
    end
    if d == '' then
        d = 1
    end
    -- create time
    return os.time{year=y, month=m, day=d, hour=0}
end
--[[
--Tests:
print(  os.date( "%Y-%m-%d", parseDate("2019-12-28") )  )
print(  os.date( "%Y-%m-%d", parseDate("2019-12") )  )
print(  os.date( "%Y-%m-%d", parseDate("2019") )  )
]]
0
ответ дан 4 December 2019 в 15:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: