模組:Date Convert/sandbox
外观

![]() | 这是Module:Date Convert(差异)的沙盒。 参见本模块的测试样例(运行)。 |
![]() | 此模块sandbox被引用於約5,200個頁面。 為了避免造成大規模的影響,所有對此模块sandbox的編輯應先於沙盒或測試樣例上測試。 測試後無誤的版本可以一次性地加入此模块sandbox中,但是修改前請務必於討論頁發起討論。 模板引用數量會自動更新。 |
本模块用于将各类日期转换为ISO 8601格式或中文日期,以方便{{#time:params}}
函数和其他模板调用。
用法
输出ISO日期
使用{{#invoke:Date_Convert|ISODate}}
函数。
输入完整日期,只输入年月、只输入年份皆可:
{{#invoke:Date_Convert|ISODate|1994年10月26日}}
→ 1994-10-26{{#invoke:Date_Convert|ISODate|1994年10月}}
→ 1994-10{{#invoke:Date_Convert|ISODate|1994年}}
→ 1994
当月和日是个位数时,十位加“0”或不加“0”皆可,模块会自动补“0”,
{{#invoke:Date_Convert|ISODate|1994年8月1日}}
→ 1994-08-01{{#invoke:Date_Convert|ISODate|1994年08月01日}}
→ 1994-08-01
可以转换英文和非规范的ISO 8601日期:
{{#invoke:Date_Convert|ISODate|October 26, 1994}}
→ 1994-10-26{{#invoke:Date_Convert|ISODate|26 Oct 1994}}
→ 1994-10-26{{#invoke:Date_Convert|ISODate|Sept 1994}}
→ 1994-09{{#invoke:Date_Convert|ISODate|1994-8-1}}
→ 1994-08-01{{#invoke:Date_Convert|ISODate|1994-8}}
→ 1994-08
如果字符串以正确的日期开头,则会转换并忽视后缀文字:
{{#invoke:Date_Convert|ISODate|1994年10月26日,武汉}}
→ 1994-10-26{{#invoke:Date_Convert|ISODate|1994年10月26日,武汉|suffix=yes}}
→ 1994-10-26,武汉(将suffix
字段设为yes
展示后缀)
以不合法日期开头则报错:
{{#invoke:Date_Convert|ISODate|一九九四年十月二十六日}}
→ 错误:时间格式不正确{{#invoke:Date_Convert|ISODate|1994年13月32日}}
→ 错误:时间格式不正确{{#invoke:Date_Convert|ISODate|一九九四年十月二十六日|error=ignore}}
→ 一九九四年十月二十六日(将error
字段设为ignore
返回输入值)
ISO 8601标准只规定了1583年之后的日期标准,请勿用本模块表示这之前的日期,否则可能会得到不期待的结果:
{{#invoke:Date_Convert|ISODate|25年8月5日(东汉建立)|suffix=yes}}
→ 0023-08-05(东汉建立)
而{{#invoke:ISODate|dates|xxx}}
等效於此{{#invoke:Date_Convert|ISODate|xxx}}
。
输出中文日期
使用{{#invoke:Date_Convert|ChineseDate}}
函数。
输入完整日期,只输入年月、只输入年份皆可:
{{#invoke:Date_Convert|ChineseDate|1994年10月26日}}
→ 1994年10月26日{{#invoke:Date_Convert|ChineseDate|1994年10月}}
→ 1994年10月{{#invoke:Date_Convert|ChineseDate|1994年}}
→ 1994年
当月和日是个位数时,十位加“0”或不加“0”皆可,模块会自动补“0”,
{{#invoke:Date_Convert|ChineseDate|1994年8月1日}}
→ 1994年8月1日{{#invoke:Date_Convert|ChineseDate|1994年08月01日}}
→ 1994年8月1日
可以转换英文和非规范的ISO 8601日期:
{{#invoke:Date_Convert|ChineseDate|October 26, 1994}}
→ 1994年10月26日{{#invoke:Date_Convert|ChineseDate|26 Oct 1994}}
→ 1994年10月26日{{#invoke:Date_Convert|ChineseDate|Sept 1994}}
→ 1994年9月{{#invoke:Date_Convert|ChineseDate|1994-8-1}}
→ 1994年8月1日{{#invoke:Date_Convert|ChineseDate|1994-8}}
→ 1994年8月
如果字符串以正确的日期开头,则会转换并忽视后缀文字:
{{#invoke:Date_Convert|ChineseDate|1994年10月26日,武汉}}
→ 1994-10-26
以不合法日期开头则报错:
{{#invoke:Date_Convert|ChineseDate|一九九四年十月二十六日}}
→ 错误:时间格式不正确{{#invoke:Date_Convert|ChineseDate|1994年13月32日}}
→ 错误:时间格式不正确{{#invoke:Date_Convert|ChineseDate|一九九四年十月二十六日|error=ignore}}
→ 一九九四年十月二十六日(将error
字段设为ignore
返回输入值)
ISO 8601标准只规定了1583年之后的日期标准,请勿用本模块表示这之前的日期,否则可能会得到不期待的结果:
{{#invoke:Date_Convert|ChineseDate|25年8月5日(东汉建立)}}
→ 23年8月5日
而{{#invoke:Date_Convert|ChineseDate|xxx}}
等效於此{{#invoke:Chinese_date|main|xxx}}
。
参见
require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local mError
local p = {}
local timeErrorMessage
local function getTimeErrorMessage()
if not timeErrorMessage then
timeErrorMessage = mw.getCurrentFrame():callParserFunction('#time', '', 'error')
end
return timeErrorMessage
end
local function makeError(message)
if not mError then
mError = require('Module:Error')
end
return mError.error({'[[Module:Date Convert]]錯誤:' .. message})
end
local langObj = mw.language.getContentLanguage()
local function formatTime(format, input)
if input then
local success, value = pcall(function ()
return langObj:formatDate(format, input)
end)
if success then
return value
end
end
return nil
end
-- @args input (string)
-- @returns
-- - format ('Y-m-d'/'Y-m'/'Y'/'m-d'/nil)
-- - val (string/nil)
-- - suf (string/nil)
local function convert(input)
input = input
:gsub(" "," ")
:gsub("%s+"," ")
:gsub('(%a+)[ ,]*(%d+)', '%1 %2');
local y, m, d, suf
local datePatternList = {
-- English date format
{'%d%d? ?%a+[ ,]*%d+', 'Y-m-d'}, -- 26 Oct 1994
{'%a+ ?%d%d?[ ,]+%d+', 'Y-m-d'}, -- Oct 26, 1994
{'%a+[ ,]*%d%d%d%d+', 'Y-m'}, -- Oct 1994
{'%a+ ?%d%d?', 'Y-m-d'}, -- Oct 26
{'%d%d? *%a+', 'Y-m-d'}, -- 26 Oct
-- Slash or hyphen date format
{'%d+/%d%d?/%d+', 'Y-m-d'}, -- 1994/10/26 or 10/26/1994
{'%d+%.%d%d?%.%d+', 'Y-m-d'}, -- 1994.10.26 or 26.10.1994
{'%d%d?/%d%d?', 'Y-m-d'}, -- 10/26
{'%d+%-%d%d?%-%d+', 'Y-m-d'}, -- 1994-10-26 or 26-10-94
{'%d%d%d%d+%-%d%d?', 'Y-m'}, -- 1994-10
{'%d%d%d%d', 'Y'}, -- 1994
}
y, m, d, suf = string.match(input, '^(%d+)年(%d%d?)月(%d%d?)日(.*)$');
if y then
if #y < 4 then
y = string.rep(0, 4 - #y) .. y
end
return 'Y-m-d', y .. '-' .. m .. '-' .. d, suf
end
y, m, suf = string.match(input, '^(%d+)年(%d%d?)月(.*)$');
if y then
if #y < 4 then
y = string.rep(0, 4 - #y) .. y
end
return 'Y-m', y .. '-' .. m, suf
end
y, suf = string.match(input, '^(%d+)年(.*)$');
if y then
if #y < 4 then
y = string.rep(0, 4 - #y) .. y
end
return 'Y', y, suf
end
m, d, suf = string.match(input, '^(%d%d?)月(%d%d?)日(.*)$');
if m and tonumber(m) then
return 'm-d', m .. '-' .. d, suf
end
for _, value in ipairs(datePatternList) do
local str, suf = string.match(input, '^(' .. value[1] .. ')(.*)$');
if str then
return value[2], str, suf
end
end
return nil, nil, nil
end
function p._converttime(input, showsuf)
local format, date, suf = convert(input)
local result = formatTime(format, date) or getTimeErrorMessage()
if yesno(showsuf) then
return result .. suf
else
return result
end
end
local function dateFunctionWrap(template, formatFunction)
if not formatFunction then
formatFunction = formatTime
end
return function (args)
local input = args[1]
if not input or input == '' then
return makeError('輸入為空。')
end
local format, date, suffix = convert(input)
suffix = (args.suf and suffix) or ''
local result = date and formatFunction(format, date) or nil
if result then
return result
elseif args.error == 'ignore' then
return input
else
return getTimeErrorMessage() .. '[[Category:Template:' .. template .. '使用錯誤]]'
end
end
end
function p.ChineseDate(frame)
local args = getArgs(frame)
return p._ChineseDate(args)
end
p._ChineseDate = dateFunctionWrap('Chinese date', function (format, date)
if format == 'Y-m-d' then
return formatTime('Y年n月j日', date):gsub("^0+","")
elseif format == 'Y-m' then
return formatTime('Y年n月', date):gsub("^0+","")
elseif format == 'Y' then
return formatTime('Y年', date):gsub("^0+","")
elseif format == 'm-d' then
return formatTime('n月j日', date):gsub("^0+","")
else
error('Internal error: invalid format "' .. format .. '".')
end
end)
p._ISODate = dateFunctionWrap('ISODate')
local function invokeWarp(func)
return function (frame)
local args = getArgs(frame)
return p[func](args)
end
end
p.ChineseDate = invokeWarp('_ChineseDate')
p.ISODate = invokeWarp('_ISODate')
return p