Help:数据类型 日期型

数据类型Date（日期型）适用于那些表示时间点（points in time，时刻）的数据取值. 该类型还可以采用统一的格式来支持整个人类历史进程当中的日期，并且为支持更多的语言还提供有国际化选项. 所有的日期和时间均指的是当前服务器（当前维基站点）的"本地时间（local time）". 维基站点可以依据通用惯例来界定自己所指的是什么时区（timezone）. 对于导出来说，提供的将是不带时区信息的时间. 不过，支持相对于本地时间的时间偏移量（time offsets）.

输入示例
如下是关于采用英语时典型日期输入的示例：
 * Has date::Feb 11 2000 10:00:01（带有时间的完整日期）
 * Has date::Feb 11 2000（仅有日期）
 * Has date::2000（仅有年份）
 * Has date::Feb 11 2000 10:00:01 PM（带有时间及“PM”的完整日期）
 * Has date::Feb 11 2000 22:00:01（24小时制的完整日期）
 * Has date::2000-02-11T22:00:01（ISO样式的日期）
 * Has date::2000-02-11T22:00:01+02:00（带有偏移量的ISO样式日期）
 * Has date::2000 February 2（支持可变的输入顺序）
 * Has date::2-3-2000 （究竟是月还是日，首选解释有时取决于语言设置）
 * Has date::2/3/2000（可以识别所有语言当中的各种分隔符）
 * Has date::Jan 1 300 BC（支持公元前日期）
 * Has date::14000000000 BC（宇宙年龄的估计值）
 * Has date::Feb 11 2000 Jl（儒略历日期）
 * Has date::Feb 11 1492 Gr（视为公历来处理的日期）
 * Has date::Feb 11 2000 10:00 GMT（带有时区简称的日期）
 * Has date::2000-02-22（MySQL日期格式）
 * Has date::1999-00-00（MySQL不完整日期格式）

测试：
 * Has date::Sun Jun 20 23:21:05 1993

其他语言亦可支持作为月份名称的附加字符串，而且，对于存在歧义的日期，亦可选择不同的首选解释. 不过，基本格式则是相同的.

显示格式
利用用户首选项当中的语言设置，无法更改日期显示所采用的简单格式. 所显示日期当中的月份名称仅仅是依据维基站点当前语言来翻译的（如果有现成可用的翻译名称的话）. 日期的显示并不考虑用户设置. 从1.7.0版的Semantic MediaWiki起，亦可在打印输出请求之后使用"#MEDIAWIKI"，从而让日期时间的格式编排采用MediaWiki的i18n（国际化）方法. 这种方法拥有优秀的i18n支持，但却无法处理所有的可能取值，因为MediaWiki的格式编排仅仅涵盖非常有限的日期范围，通常在1901-12-14与2038-01-19之间. 请注意，这种格式与采用的LocalSettings.php当中的维基站点语言设置是捆绑在一起的.

如果您希望在查询（嵌入式查询或概念）的打印输出请求当中保持这种简单的格式， 可在此类打印输出请求后面使用"#ISO". 这样，所获得的就会是"2008-01-09"（利用打印输出请求 获得），而不是显示"Jan 9 2008"（利用打印输出请求 获得）. 这是一种普通格式，用来表示ISO格式编排式样的国际日期字符串.

显示会考虑到是否忽略了日期的组成部分. 因此，指定为"2008"的日期，在任何地方也都将打印输出为"2008"，即使是当与其他日期相比的时候，它有可能会被解释成"Jan 1 2008 00:00:00".

不完整日期的处理
此类型的实现会注意到是否略去了日期/时间的组成部分并加以存储（比如在"2008"或"May 2007"当中）. 对于所有的导出和排序目的，将采用默认值对不完整的日期加以补全（通常是采用最早的可能时间，比如，将"2008"解释为"Jan 1 2008 00:00:00"）. 不过，为了行为的改进，比如，对于输出（在查询某个取值的时候并不打印输出默认值），还是会在内部保存关于究竟对什么未加说明的信息.

在日期当中，只能略去次要的那些组成部分："May 2008"就可以，而"May 1"就不行. 之所以如此是因为，在日期排序的时候，无法给予后者一个合理的默认解释. 为了支持排序和查询，所有的日期都必须分别可以解释成某个具体而精确的时间点，而这在需要的时候将在内部完成，即使是对于不完整的日期.

日历模型
当前，日期型支持两种日历模型：公历（Gregorian calendar，格里历，阳历，西历）和儒略历（Julian calendar）. 1582年，天主教会提出了儒略历改革. 因此，1582年2月24日之前的日期默认情况下均应当指的是儒略历. 相应地，此次改革之后的日期则被视为公历. 然而，我们可以采取手工方式，通过采用Jl或Gr（亦可理解西洋旧历）来标注所输入的日期，来指定该日期的日历模型. 在内部，日期型采用的是proleptic Gregorian calendar（早发式格里历）（这是一个可将公历拓展到过去的扩展）来表示日期.

最大日期范围
日期型可以处理整个历史过程中的日期，并且可以全面的精确度用于存储，以及采用相当大的精确度用于排序和查询. 所支持既往日期的范围应当涵盖如今大多数理论所说的时间起点（Beginning of Time）. 所支持未来日期的范围则受到比较严格的限制，但其同时也允许采用10^9数量级的年份数.

公元前年份、负值年份以及零年
公元前年份（Years before common era，BC）可通过在日期之中使用"BC"来表示. 假设不存在"零年（year 0）"：年份的历史顺序为……、2 BC、1 BC、1 AD、2AD、…… 如果把"零年（year 0）"作为输入来提供的话，无论其带不带BC，均将被解释为1 BC. 然而，并不鼓励这种用法.

SMW之中所采用的内部数字型日期模型（internal numeric date model）支持"零年（year 0）"，并将其视为等同于"1 BC". 依据这项约定，比如，年份"-100"就等同于"101 BC"（其中，后者采用的是不允许使用"零年"的另一种约定；但是，后者明确赞成ISO约定，并宣称将来会在XML当中使用这种约定）. 请注意：本实现当前并不支持将负值年份指定为输入；负数仅在内部使用.

时间偏移量与时区
当前支持时间偏移量（比如，"1 1 2008 12:00-2:00"）. 如上所述，此类时间指的是本地时间. 时间偏移量将会考虑到闰年，比如，日期"Feb 28 2004 23:00+2:00"等同于"29 February 2004 01:00:00"，而"Feb 28 1900 23:00+2:00"则等同于"1 March 1900 01:00:00". 此外，可以采用常用的时区简称（如ADT、AST、CET、CST、CXT、EST、HAC、HAT、HNR、MEZ、MST、NFT）来指定时间偏移量，如"1 March 1998 08:00:00 EST".

表格输出当中的日期排序
MediaWiki的可排序表格（sortable table）代码无法处理日期. 要让它们正确进行排序，需要在td元素当中利用特征属性"data-sort-value"（数据排序取值）来提供数字型排序键（numeric sortkeys）（有关示例，请参见任何实际SMW表格的HTML源代码）. 为了让其能够正确排序，向该数据类型当中添加了新的参数"#SORTKEY"；借助于该参数，则可以获得"data-sort-value"所需的一个数字型排序键. 例如，下列查询将显示出若干的日期及其排序键：

对于那些可以拥有多个取值的属性，必须仅仅使用一个排序键（因为整个表格行是作为一个整体来排序，即使是一个单元格当中存在多个日期）. 如下例所示，可以利用参数"+limit"来实现这种情况下的排序：

尚需进一步磋商的事项

 * MediaWiki的自定义日期格式编排仅可用于那些通常位于1901-12-14与2038-01-19之间的日期.
 * 国际化尚不完整：对于所有的语言，"BC"、"AD"、"PM"、"AM"均是固定不变的.
 * 目前尚不支持（历史）日历模型之间的转换.