最近一直在折腾Cargo和模板,越发就觉得MediaWiki了不起,很多原本设想的功能貌似都有解决途径,当然这得另说了。要吐槽一下的是,关于Cargo的资料真的是太少了,官方那点文档只是给了点基本提示,想要进一步使用的话真心困难,好在有几个不错的网站还是可以借鉴一下的。
言归正传,说一下日期格式的话题。
Cargo的数据表中,如果涉及日期的字段可以选择Date形式,也就是日期格式。我们先来看看表单形式和Cargo表格各自的样式。
Personal-Info-Form.png
Cargo-Personal-Info-Table.png
通过模板输出的日期格式跟数据表的样式是一样的,即YYYY-MM-DD或者是YYYY/MM/DD,总之放在中文的页面中阅读总归不太顺眼。所以我要做的就是调整一下格式,希望它能输出YYYY年MM月DD日。
备注:关于日期格式的问题,在维基百科上有过一个讨论,就是很多中文区的朋友喜欢在直接将“YYYY年MM月DD日”的格式填写在日期的位置,比如引用模板中的出版日期。而这种格式对于系统来说是作为字符串处理,并不利于检索。
维基百科上有一个叫做日期的模板,就是专门用来转换格式的。从模板用法{{日期|y|m|d}}中我们不难看出,它是通过管道符号将年月日作为三个参数分别输入,然后达到转换,并且很不幸的是,它在用法中也提到了,如果是{{日期|2008-12-31}}这样的用法,输出的就是2008-12-31年。
搜索过程中无意间看到MediaWiki的函数表达式#time,通过它就可以转换时间格式。将日期参数适当做个调整,如下:

{{#time:Y年n月j日|{{{birth_date|}}}|zh-cn}}

简单解释一下上面的代码:Y代表年份的数字,所以其后面添加中文字“年”;n代表月份的数字,后面需加“月”字,中文区的话如果使用M和m的话,则会在数字后面直接带“月”字,但要注意的是它们的区别(如9月份的话,使用m则显示09月,用M就是9月);j代表的日期,后面需加“日”字。更多内容还请浏览官方文档
Personal-Infobox.png
很不幸的是,使用这种方法,丹尼尔·西格尔就这么被我“弄死”了。从Cargo数据表上我们能够看到,他的逝世日期是空白的(废话,人家活得好好的),那为什么到了信息框中就变成了2020年9月11日了呢?因为在这一天我刷新了数据表,然后#time就把当时的时间给记录了下来,于是就这样把他给刷死了。

{{#if:{{{death_date|}}}|{{#time:Y年n月j日|{{{death_date|}}}|zh-cn}}}}

加个条件试试,刷死的问题解决了。
不过也没得瑟多久,又有一个新的问题出现了,在做另一个模板时,日期只能确定年份或者是具体到月份。如果再用上述的方法,那么在日期那天系统会默认为1号,也就是说2020年9月的某个日期都会变成2020年9月1日,这样一来反倒是会误导一大片。
到这里基本上能确认的是,必须对日期增加判断语句才行,没有具体日期就只输出年月,如果连月份都没有就只输出年份。为了避免将判断语句直接写进需要的模板中,最好的办法就是另外创建一个模板或者是模块进行日期格式的转化。
万能的网络提供了两种思路,维基百科有现成的模块,而后根据模块再生成各类模板。另外一种就是直接通过模板的方式进行转换,但是需要对代码做适当的调整,对于中文的转化效果也很一般。
其实这个转换的难度就在于把标准的日期格式作为字符串进行分段,提取出年、月、日的数字来,然后再在其中插入中文的“年、月、日”。我能想到的一个思路就是将日期标准化,强制使用{{#formatdate:日期|ISO 8601}}将格式变为YYYY-MM-DD,然后将中间-替换成管道符号|拆成三个参数{{{1}}}、{{{2}}}、{{{3}}},然后进行组合,变为{{{1}}}年{{{2}}}月{{{3}}}日,只不过字符替换的插件已经被MediaWiki废弃,取而代之的是Module:String
既然一样要使用模块,那我何不直接复制日期转换的模块到自己的网站呢?
当然,我们也可以通过JS代码在前端将日期格式改变,甚至将JS代码写进小工具Gadget中,想想还是算了,折腾不起。

最后修改:2020 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏