Mô đun:ViDateTimeParser
Giao diện
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Test_Template_Info-Icon_-_Version_%282%29.svg/50px-Test_Template_Info-Icon_-_Version_%282%29.svg.png)
local v = {}
v.months = { "tháng 1", "tháng 2", "tháng 3", "tháng 4", "tháng 5", "tháng 6", "tháng 7", "tháng 8", "tháng 9", "tháng 10", "tháng 11", "tháng 12", "Th1", "Th2", "Th3", "Th4", "Th5", "Th6", "Th7", "Th8", "Th9", "Th10", "Th11", "Th12", "một", "hai", "ba", "tư", "năm", "sáu", "bảy", "tám", "chín", "mười", "mười một", "mười hai" }
v._viAltMonth = { ["giêng"] = "hai", ["bốn"] = "tư" }
function v._monthSearch(t)
local r = {}
for i, mname in ipairs(t) do
r[mname:lower()] = i > 12 and i - 12 > 12 and i - 24 or i - 12 or i
end
return r
end
function v._monthAltNameR(n)
return v._viAltMonth[n] and v._viAltMonth[n] or n
end
v.monthSearch = v._monthSearch(v.months)
function v._parseMonthName(s)
s = s:lower()
local month = v.monthSearch[v._monthAltNameR(s)]
if month then
return month
end
return nil
end
function v._converter (args)
local function parseError()
error(string.format(
"Không thể phân tích cú pháp của ngày '%s'",
date
), 0)
end
if not args[1] and not args.datetime then
error("Ngày giờ cần chuyển đổi không hợp lệ!")
end
local dateTbl = os.date("*t")
local day, month, year = dateTbl.wday, dateTbl.month, dateTbl.year
date = not args[1] and tostring(args.datetime) or tostring(args[1])
local parts = mw.text.split(date, '%W+')
local nParts = #parts
if parts[1] == '' or parts[nParts] == '' or nParts > 7 or nParts < 3 then
parseError()
end
if nParts == 3 or nParts == 4 then
if nParts == 3 then
month, year = date:match('[Tt]háng (%w[%s%S]*)%, (%d[%d]*)')
if not month or not year then
month, year = date:match('(%d[%d]*) [Tt]háng (%w[%s%S]*)')
if not month or not year then
day, month, year = date:match('(%d[%d]*) ([Tt]h%d[%d]*), (%d[%d]*)')
if not day or not month or not year then
parseError()
end
end
end
else
month, year = date:match('[Tt]háng (%w[%s%S]*)% năm (%d[%d]*)')
if not month or not year then
day, month, year = date:match('(%d[%d]*) [Tt]háng (%w[%s%S]*), (%d[%d]*)')
if not day or not month or not year then
parseError()
end
end
end
elseif nParts >= 5 then
day, month, year = date:match('(%d[%d]*) [Tt]háng (%w[%s%S]*) năm (%d[%d]*)')
if not day or not month or not year then
day, month, year = date:match('[Nn]gày (%d[%d]*) [Tt]háng (%w[%s%S]*) năm (%d[%d]*)')
if not day or not month or not year then
parseError()
end
end
end
if v._parseMonthName(month) then
month = v._parseMonthName(month)
end
return year .. "/" .. month .. "/" .. day
end
local p = {}
function p._exportClasses()
return { Vdtp = v }
end
function p._main(args)
local success, ret = pcall(function ()
local vdtp = v._converter(args)
return vdtp
end)
if success then
return ret
end
end
function p.main(frame)
local args = require('Mô đun:Arguments').getArgs(frame)
return p._main(args)
end
return p