Я пытаюсь разобрать полную дату и время 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 не поддерживает часовой пояс в операционной системе.функция времени, по крайней мере, я бы знал, как ее нужно настраивать.
Я подумал о том, чтобы убрать все, что находится после "." (миллисекунды и часовой пояс), но тогда у меня действительно не было бы действительной даты и времени. Миллисекунды не так уж и важны, и я был бы не против их потерять, но часовой пояс все меняет.
Примечание: у кого-то может быть гораздо лучший код для этого, и я не женат на нем, мне просто нужно извлечь что-то полезное из строки даты и времени :)
Вот простое 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") ) )
]]