PostgreSQL 支持完整的SQL日期和时间类型,如表 8.9所示。这些数据类型可用的操作在第 9.9 节中描述。日期按照公历计算,即使在公历引入之前的年份也是如此(有关更多信息,请参阅第 B.6 节)。
表 8.9. 日期/时间类型
名称 | 存储大小 | 描述 | 最小值 | 最大值 | 分辨率 |
---|---|---|---|---|---|
timestamp [ ( |
8 字节 | 日期和时间(无时区) | 公元前 4713 年 | 公元 294276 年 | 1 微秒 |
timestamp [ ( |
8 字节 | 日期和时间,带时区 | 公元前 4713 年 | 公元 294276 年 | 1 微秒 |
date |
4 字节 | 日期(无一天中的时间) | 公元前 4713 年 | 公元 5874897 年 | 1 天 |
time [ ( |
8 字节 | 一天中的时间(无日期) | 00:00:00 | 24:00:00 | 1 微秒 |
time [ ( |
12 字节 | 一天中的时间(无日期),带时区 | 00:00:00+1559 | 24:00:00-1559 | 1 微秒 |
interval [ |
16 字节 | 时间间隔 | -178000000 年 | 178000000 年 | 1 微秒 |
SQL 标准要求仅写入 timestamp
等同于 timestamp without time zone
,并且 PostgreSQL 遵循此行为。timestamptz
被接受为 timestamp with time zone
的缩写;这是一个 PostgreSQL 扩展。
time
、timestamp
和 interval
接受一个可选的精度值 p
,它指定秒字段中保留的小数位数。默认情况下,精度没有明确的限制。p
的允许范围是 0 到 6。
interval
类型还有一个额外的选项,即通过写入以下短语之一来限制存储的字段集
YEAR MONTH DAY HOUR MINUTE SECOND YEAR TO MONTH DAY TO HOUR DAY TO MINUTE DAY TO SECOND HOUR TO MINUTE HOUR TO SECOND MINUTE TO SECOND
请注意,如果同时指定了 fields
和 p
,则 fields
必须包含 SECOND
,因为精度仅适用于秒。
类型 time with time zone
由 SQL 标准定义,但该定义显示出导致其可用性值得怀疑的属性。在大多数情况下,date
、time
、timestamp without time zone
和 timestamp with time zone
的组合应提供任何应用程序所需的完整日期/时间功能。
日期和时间输入接受几乎任何合理的格式,包括 ISO 8601,SQL兼容、传统的 POSTGRES 和其他格式。对于某些格式,日期输入中日、月和年的顺序是模糊的,并且支持指定这些字段的预期顺序。将 DateStyle 参数设置为 MDY
以选择月-日-年解释,设置为 DMY
以选择日-月-年解释,或设置为 YMD
以选择年-月-日解释。
PostgreSQL 在处理日期/时间输入方面比SQL标准要求更加灵活。有关日期/时间输入的精确解析规则以及识别的文本字段(包括月份、星期几和时区),请参见附录 B。
请记住,任何日期或时间文字输入都需要用单引号括起来,就像文本字符串一样。有关更多信息,请参阅第 4.1.2.7 节。SQL需要以下语法
type
[ (p
) ] 'value
'
其中 p
是一个可选的精度规范,给出秒字段中的小数位数。可以为 time
、timestamp
和 interval
类型指定精度,范围为 0 到 6。如果在常量规范中未指定精度,则它默认为文字值的精度(但不超过 6 位)。
表 8.10 显示了 date
类型的一些可能输入。
表 8.10. 日期输入
示例 | 描述 |
---|---|
1999-01-08 | ISO 8601;在任何模式下均为 1 月 8 日(推荐格式) |
1999 年 1 月 8 日 | 在任何 datestyle 输入模式下都是明确的 |
1/8/1999 | 在 MDY 模式下为 1 月 8 日;在 DMY 模式下为 8 月 1 日 |
1/18/1999 | 在 MDY 模式下为 1 月 18 日;在其他模式下被拒绝 |
01/02/03 | 在 MDY 模式下为 2003 年 1 月 2 日;在 DMY 模式下为 2003 年 2 月 1 日;在 YMD 模式下为 2001 年 2 月 3 日 |
1999-Jan-08 | 在任何模式下均为 1 月 8 日 |
Jan-08-1999 | 在任何模式下均为 1 月 8 日 |
08-Jan-1999 | 在任何模式下均为 1 月 8 日 |
99-Jan-08 | 在 YMD 模式下为 1 月 8 日,否则出错 |
08-Jan-99 | 1 月 8 日,但在 YMD 模式下出错 |
Jan-08-99 | 1 月 8 日,但在 YMD 模式下出错 |
19990108 | ISO 8601;在任何模式下均为 1999 年 1 月 8 日 |
990108 | ISO 8601;在任何模式下均为 1999 年 1 月 8 日 |
1999.008 | 年和一年中的第几天 |
J2451187 | 儒略日 |
公元前 99 年 1 月 8 日 | 公元前 99 年 |
一天中的时间类型为 time [ (
和 p
) ] without time zonetime [ (
。p
) ] with time zonetime
单独使用等同于 time without time zone
。
这些类型的有效输入由一天中的时间和可选的时区组成。(请参见表 8.11和表 8.12。)如果在 time without time zone
的输入中指定了时区,则会被静默忽略。您也可以指定日期,但它会被忽略,除非您使用涉及夏令时规则的时区名称,例如 America/New_York
。在这种情况下,需要指定日期才能确定是否应用标准时间或夏令时。适当的时区偏移量记录在 time with time zone
值中,并按存储方式输出;它不会调整为活动时区。
表 8.11. 时间输入
示例 | 描述 |
---|---|
04:05:06.789 |
ISO 8601 |
04:05:06 |
ISO 8601 |
04:05 |
ISO 8601 |
040506 |
ISO 8601 |
04:05 AM |
与 04:05 相同;AM 不影响值 |
04:05 PM |
与 16:05 相同;输入的小时数必须 <= 12 |
04:05:06.789-8 |
ISO 8601,时区为 UTC 偏移量 |
04:05:06-08:00 |
ISO 8601,时区为 UTC 偏移量 |
04:05-08:00 |
ISO 8601,时区为 UTC 偏移量 |
040506-08 |
ISO 8601,时区为 UTC 偏移量 |
040506+0730 |
ISO 8601,时区为小时小数 UTC 偏移量 |
040506+07:30:00 |
以秒为单位指定的 UTC 偏移量(ISO 8601 中不允许) |
04:05:06 PST |
由缩写指定的时区 |
2003-04-12 04:05:06 America/New_York |
由全名指定的时区 |
表 8.12. 时区输入
示例 | 描述 |
---|---|
PST |
缩写(表示太平洋标准时间) |
America/New_York |
完整的时区名称 |
PST8PDT |
POSIX 样式时区规范 |
-8:00:00 |
PST 的 UTC 偏移量 |
-8:00 |
PST 的 UTC 偏移量(ISO 8601 扩展格式) |
-800 |
PST 的 UTC 偏移量(ISO 8601 基本格式) |
-8 |
PST 的 UTC 偏移量(ISO 8601 基本格式) |
zulu |
UTC 的军事缩写 |
z |
zulu 的缩写形式(也符合 ISO 8601 标准) |
有关如何指定时区的更多信息,请参阅第 8.5.3 节。
时间戳类型的有效输入由日期和时间的串联组成,后跟可选的时区,再后跟可选的 AD
或 BC
。(或者,AD
/BC
可以出现在时区之前,但这不是首选的顺序。)因此
1999-01-08 04:05:06
和
1999-01-08 04:05:06 -8:00
是有效值,它们遵循ISO8601 标准。此外,还支持通用格式
January 8 04:05:06 1999 PST
。
该SQL标准通过时间之后的 “+” 或 “-” 符号以及时区偏移量来区分 timestamp without time zone
和 timestamp with time zone
字面量。因此,根据该标准,
TIMESTAMP '2004-10-19 10:23:54'
是一个 timestamp without time zone
,而
TIMESTAMP '2004-10-19 10:23:54+02'
是一个 timestamp with time zone
。PostgreSQL 在确定字面量的类型之前绝不检查其内容,因此会将上述两者都视为 timestamp without time zone
。要确保将字面量视为 timestamp with time zone
,请为其提供正确的显式类型
TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'
在被确定为 timestamp without time zone
的字面量中,PostgreSQL 将静默忽略任何时区指示。也就是说,结果值是从输入值中的日期/时间字段派生的,并且不会针对时区进行调整。
对于 timestamp with time zone
,内部存储的值始终为 UTC(协调世界时,传统上称为格林威治标准时,GMT)。指定了显式时区的输入值会使用该时区的相应偏移量转换为 UTC。如果在输入字符串中未声明时区,则假定它位于系统 TimeZone 参数指示的时区中,并使用 timezone
区域的偏移量转换为 UTC。
当输出 timestamp with time zone
值时,它始终会从 UTC 转换为当前 timezone
区域,并以该区域的本地时间显示。要查看其他时区的时间,请更改 timezone
或使用 AT TIME ZONE
构造(请参阅第 9.9.4 节)。
在 timestamp without time zone
和 timestamp with time zone
之间进行转换时,通常假定应将 timestamp without time zone
值视为或给出为 timezone
本地时间。可以使用 AT TIME ZONE
为转换指定不同的时区。
为了方便起见,PostgreSQL 支持几个特殊的日期/时间输入值,如表 8.13所示。值 infinity
和 -infinity
在系统内部以特殊方式表示,并将保持不变地显示;但是其他值只是符号速记,将在读取时转换为普通的日期/时间值。(特别是,now
和相关字符串在读取后会立即转换为特定的时间值。)所有这些值在用作 SQL 命令中的常量时都需要用单引号括起来。
表 8.13. 特殊的日期/时间输入
输入字符串 | 有效类型 | 描述 |
---|---|---|
epoch |
date , timestamp |
1970-01-01 00:00:00+00(Unix 系统时间零) |
infinity |
date , timestamp , interval |
晚于所有其他时间戳 |
-infinity |
date , timestamp , interval |
早于所有其他时间戳 |
now |
date , time , timestamp |
当前事务的开始时间 |
today |
date , timestamp |
今天的午夜 (00:00 ) |
tomorrow |
date , timestamp |
明天的午夜 (00:00 ) |
yesterday |
date , timestamp |
昨天的午夜 (00:00 ) |
allballs |
time |
00:00:00.00 UTC |
以下SQL兼容的函数也可用于获取相应数据类型的当前时间值:CURRENT_DATE
、CURRENT_TIME
、CURRENT_TIMESTAMP
、LOCALTIME
、LOCALTIMESTAMP
。(请参阅第 9.9.5 节。)请注意,这些是 SQL 函数,并且在数据输入字符串中不被识别。
虽然输入字符串 now
、today
、tomorrow
和 yesterday
可以很好地用于交互式 SQL 命令,但当命令被保存以供以后执行时(例如在预处理语句、视图和函数定义中),它们可能会产生令人惊讶的行为。该字符串可以转换为特定的时间值,该值在失效后仍会继续使用。在这种情况下,请改用 SQL 函数之一。例如,CURRENT_DATE + 1
比 'tomorrow'::date
更安全。
可以将日期/时间类型的输出格式设置为四种样式之一:ISO 8601、SQL(Ingres)、传统的 POSTGRES (Unix date 格式) 或德语。默认设置为ISO格式。(该SQL标准要求使用 ISO 8601 格式。“SQL” 输出格式的名称是一个历史上的偶然事件。)表 8.14 显示了每种输出样式的示例。date
和 time
类型的输出通常只包含根据给定示例的日期或时间部分。但是,POSTGRES 样式会以以下格式输出仅包含日期的值:ISO格式。
表 8.14. 日期/时间输出样式
样式规范 | 描述 | 示例 |
---|---|---|
ISO |
ISO 8601,SQL 标准 | 1997-12-17 07:37:16-08 |
SQL |
传统样式 | 12/17/1997 07:37:16.00 PST |
Postgres |
原始样式 | Wed Dec 17 07:37:16 1997 PST |
德语 |
区域样式 | 17.12.1997 07:37:16.00 PST |
ISO 8601 指定使用大写字母 T
来分隔日期和时间。PostgreSQL 接受该格式的输入,但在输出时,它使用空格而不是 T
,如上所示。这是为了提高可读性,并与 RFC 3339 以及其他一些数据库系统保持一致。
在SQL和 POSTGRES 样式中,如果指定了 DMY 字段顺序,则日期会显示在月份之前,否则月份会显示在日期之前。(有关此设置如何影响输入值的解释,请参阅第 8.5.1 节。)表 8.15 显示了示例。
表 8.15. 日期顺序约定
datestyle 设置 |
输入顺序 | 示例输出 |
---|---|---|
SQL, DMY |
day /month /year |
17/12/1997 15:37:16.00 CET |
SQL, MDY |
month /day /year |
12/17/1997 07:37:16.00 PST |
Postgres, DMY |
day /month /year |
Wed 17 Dec 07:37:16 1997 PST |
在ISO样式中,时区始终显示为与 UTC 的带符号数值偏移量,格林威治以东的区域使用正号。如果偏移量是小时的整数,则偏移量将显示为 hh
(仅小时),如果它是分钟的整数,则显示为 hh
:mm
,否则显示为 hh
:mm
:ss
。(第三种情况在任何现代时区标准中都不可能出现,但在使用早于采用标准化时区的时间戳时可能会出现。)在其他日期样式中,如果当前区域常用,则时区将显示为字母缩写。否则,它将以 ISO 8601 基本格式(hh
或 hhmm
)显示为带符号的数值偏移量。
用户可以使用 SET datestyle
命令、postgresql.conf
配置文件中的 DateStyle 参数或服务器或客户端上的 PGDATESTYLE
环境变量来选择日期/时间样式。
格式化函数 to_char
(请参阅第 9.8 节)也可用作格式化日期/时间输出的更灵活方式。
时区和时区惯例受政治决策的影响,而不仅仅是地球几何形状。世界各地的时区在 20 世纪期间变得有些标准化,但仍然容易发生任意更改,尤其是在夏令时规则方面。PostgreSQL 使用广泛使用的 IANA (Olson) 时区数据库来获取有关历史时区规则的信息。对于未来的时间,假设给定时间区域的最新已知规则将无限期地持续到未来。
PostgreSQL 致力于与SQL标准的典型用法定义兼容。然而,SQL标准对日期和时间类型以及功能进行了奇怪的混合。两个明显的问题是:
尽管 date
类型不能具有关联的时区,但 time
类型可以。除非将时区与日期和时间相关联,否则现实世界中的时区几乎没有意义,因为偏移量可能会在一年中随着夏令时边界而变化。
默认时区指定为与UTC的常量数值偏移量。因此,在跨越DST边界进行日期/时间运算时,不可能适应夏令时。
为了解决这些难题,我们建议在使用时区时使用包含日期和时间的日期/时间类型。我们不建议使用 time with time zone
类型(尽管 PostgreSQL 支持该类型以用于遗留应用程序以及为了符合SQL标准)。对于任何仅包含日期或时间的类型,PostgreSQL 都会假定您的本地时区。
所有时区感知日期和时间都在内部存储在UTC中。它们在显示给客户端之前,会转换为 TimeZone 配置参数指定的时区中的本地时间。
PostgreSQL 允许您以三种不同的形式指定时区
完整的时区名称,例如 America/New_York
。 可以在 pg_timezone_names
视图中找到已识别的时区名称列表(请参阅 第 52.32 节)。 PostgreSQL 为此使用广泛使用的 IANA 时区数据,因此其他软件也可以识别相同的时区名称。
时区缩写,例如 PST
。与完整的时区名称(可以隐含一组夏令时转换规则)相反,这样的指定仅定义了与 UTC 的特定偏移量。可以在 pg_timezone_abbrevs
视图中找到已识别的缩写列表(请参阅 第 52.31 节)。您不能将配置参数 TimeZone 或 log_timezone 设置为时区缩写,但您可以在日期/时间输入值和 AT TIME ZONE
运算符中使用缩写。
除了时区名称和缩写之外,PostgreSQL 还将接受 POSIX 样式的时区规范,如 第 B.5 节 中所述。通常,此选项不如使用命名时区更好,但如果没有合适的 IANA 时区条目可用,则可能有必要使用此选项。
简而言之,缩写和全名之间的区别在于:缩写表示与 UTC 的特定偏移量,而许多全名隐含了本地夏令时规则,因此具有两种可能的 UTC 偏移量。例如,2014-06-04 12:00 America/New_York
表示纽约当地时间中午,该特定日期为夏令时(UTC-4)。因此,2014-06-04 12:00 EDT
指定同一时间点。但是,2014-06-04 12:00 EST
指定东部标准时间中午(UTC-5),无论该日期是否名义上生效夏令时。
更复杂的是,某些司法管辖区在不同时间使用相同的时区缩写来表示不同的 UTC 偏移量;例如,在莫斯科,MSK
在某些年份表示 UTC+3,在另一些年份表示 UTC+4。PostgreSQL 根据缩写在指定日期所表示的含义(或最近的含义)来解释此类缩写;但是,与上面的 EST
示例一样,这不一定与该日期当天的当地民用时间相同。
在所有情况下,时区名称和缩写都以不区分大小写的方式识别。(这是从 8.2 之前的 PostgreSQL 版本更改的,该版本在某些上下文中区分大小写,而在其他上下文中则不区分。)
时区名称和缩写都没有硬编码到服务器中;它们是从安装目录的 .../share/timezone/
和 .../share/timezonesets/
下存储的配置文件中获取的(请参阅 第 B.4 节)。
可以在文件 postgresql.conf
中或 第 19 章 中描述的任何其他标准方式中设置 TimeZone 配置参数。还有一些特殊的方法来设置它
该SQL命令 SET TIME ZONE
设置会话的时区。这是 SET TIMEZONE TO
的另一种拼写,具有更符合 SQL 规范的语法。
libpq 客户端使用 PGTZ
环境变量在连接时向服务器发送 SET TIME ZONE
命令。
可以使用以下详细语法写入 interval
值
[@]quantity
unit
[quantity
unit
...] [direction
]
其中 quantity
是一个数字(可能是有符号的);unit
是 microsecond
、millisecond
、second
、minute
、hour
、day
、week
、month
、year
、decade
、century
、millennium
,或这些单位的缩写或复数;direction
可以是 ago
或为空。at 符号 (@
) 是可选的噪音。不同单位的数量会隐式添加,并使用适当的符号进行计算。ago
会否定所有字段。如果 IntervalStyle 设置为 postgres_verbose
,则此语法也用于间隔输出。
天、小时、分钟和秒的数量可以指定而无需显式单位标记。例如,'1 12:59:10'
与读取 '1 day 12 hours 59 min 10 sec'
相同。此外,年和月的组合可以用破折号指定;例如,'200-10'
与读取 '200 years 10 months'
相同。(这些较短的形式实际上是标准允许的唯一形式,并且当 IntervalStyle
设置为 sql_standard
时用于输出。)SQL标准,并且当 IntervalStyle
设置为 sql_standard
时用于输出。)
间隔值也可以写为 ISO 8601 时间间隔,使用标准 4.4.3.2 节的“带有指示符的格式”或 4.4.3.3 节的“替代格式”。带有指示符的格式如下所示
Pquantity
unit
[quantity
unit
...] [ T [quantity
unit
...]]
字符串必须以 P
开头,并且可以包含引入时间单位的 T
。可在 表 8.16 中找到可用的单位缩写。单位可以省略,并且可以按任意顺序指定,但小于一天的单位必须出现在 T
之后。特别是,M
的含义取决于它是在 T
之前还是之后。
表 8.16. ISO 8601 间隔单位缩写
缩写 | 含义 |
---|---|
Y | 年 |
M | 月(在日期部分中) |
W | 周 |
D | 天 |
H | 小时 |
M | 分钟(在时间部分中) |
S | 秒 |
在替代格式中
P [years
-months
-days
] [ Thours
:minutes
:seconds
]
字符串必须以 P
开头,并且 T
分隔间隔的日期和时间部分。这些值以类似于 ISO 8601 日期的数字形式给出。
当使用 fields
规范写入间隔常量,或者将字符串分配给使用 fields
规范定义的间隔列时,未标记数量的解释取决于 fields
。例如,INTERVAL '1' YEAR
被读取为 1 年,而 INTERVAL '1'
表示 1 秒。此外,fields
规范允许的最小有效字段“右侧”的字段值会被静默丢弃。例如,写入 INTERVAL '1 day 2:03:04' HOUR TO MINUTE
会导致删除秒字段,但不会删除天字段。
根据SQL标准,间隔值的所有字段必须具有相同的符号,因此前导负号适用于所有字段;例如,间隔文字 '-1 2:03:04'
中的负号适用于天和小时/分钟/秒部分。PostgreSQL 允许字段具有不同的符号,并且传统上将文本表示形式中的每个字段视为独立签名,因此在此示例中,小时/分钟/秒部分被认为是正数。如果 IntervalStyle
设置为 sql_standard
,则前导符号被认为适用于所有字段(但前提是没有出现其他符号)。否则,将使用传统的 PostgreSQL 解释。为了避免歧义,建议在任何字段为负数时为每个字段附加一个显式符号。
在内部,interval
值存储为三个整数字段:月、天和微秒。这些字段是分开保存的,因为一个月中的天数各不相同,而如果涉及夏令时转换,则一天可能有 23 或 25 个小时。使用其他单位的间隔输入字符串会规范化为这种格式,然后以标准方式重新构造以用于输出,例如
SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::interval; interval --------------------------------------- 3 years 3 mons 700 days 133:17:36.789
这里,周(被理解为“7 天”)被分开保存,而较小和较大的时间单位被组合和规范化。
输入字段值可以具有小数部分,例如 '1.5 weeks'
或 '01:02:03.45'
。但是,由于 interval
内部仅存储整数字段,因此必须将小数转换为较小的单位。大于月份的单位的小数部分会四舍五入为整数个月,例如 '1.5 years'
变为 '1 year 6 mons'
。周和天的小数部分将计算为整数天和微秒,假设每月 30 天,每天 24 小时,例如,'1.75 months'
变为 1 mon 22 days 12:00:00
。输出时,只有秒会显示为小数。
表 8.17 显示了一些有效的 interval
输入示例。
表 8.17. 间隔输入
示例 | 描述 |
---|---|
1-2 |
SQL 标准格式:1 年 2 个月 |
3 4:05:06 |
SQL 标准格式:3 天 4 小时 5 分钟 6 秒 |
1 年 2 个月 3 天 4 小时 5 分钟 6 秒 |
传统的 Postgres 格式:1 年 2 个月 3 天 4 小时 5 分钟 6 秒 |
P1Y2M3DT4H5M6S |
ISO 8601 “带有指示符的格式”:与上面相同的含义 |
P0001-02-03T04:05:06 |
ISO 8601 “替代格式”:与上面相同的含义 |
正如之前解释的,PostgreSQL 将 interval
值存储为月、日和微秒。对于输出,月份字段通过除以 12 转换为年和月。天数字段按原样显示。微秒字段转换为小时、分钟、秒和秒的小数部分。因此,月份、分钟和秒永远不会显示为超出 0-11、0-59 和 0-59 的范围,而显示的年、天和小时字段可能会非常大。(如果希望将较大的天数或小时数值转换为更高一级的字段,可以使用 justify_days
和 justify_hours
函数。)
可以使用命令 SET intervalstyle
将 interval 类型的输出格式设置为四种样式之一:sql_standard
、postgres
、postgres_verbose
或 iso_8601
。默认格式为 postgres
。表 8.18 显示了每种输出样式的示例。
如果间隔值符合标准限制(仅限年月或仅限日时,不混合正负分量),则 sql_standard
样式会生成符合 SQL 标准中关于间隔文字字符串规范的输出。否则,输出看起来像标准的年月文字字符串,后跟一个日时文字字符串,并添加了显式符号以消除混合符号间隔的歧义。
当 DateStyle 参数设置为 ISO
时,postgres
样式的输出与 8.4 之前的 PostgreSQL 版本的输出相匹配。
当 DateStyle
参数设置为非 ISO
输出时,postgres_verbose
样式的输出与 8.4 之前的 PostgreSQL 版本的输出相匹配。
iso_8601
样式的输出与 ISO 8601 标准第 4.4.3.2 节中描述的“带指示符的格式”相匹配。
表 8.18. 间隔输出样式示例
样式规范 | 年月间隔 | 日时间隔 | 混合间隔 |
---|---|---|---|
sql_standard |
1-2 | 3 4:05:06 | -1-2 +3 -4:05:06 |
postgres |
1 年 2 个月 | 3 天 04:05:06 | -1 年 -2 个月 +3 天 -04:05:06 |
postgres_verbose |
@ 1 年 2 个月 | @ 3 天 4 小时 5 分钟 6 秒 | @ 1 年 2 个月 -3 天 4 小时 5 分钟 6 秒前 |
iso_8601 |
P1Y2M | P3DT4H5M6S | P-1Y-2M3DT-4H-5M-6S |
如果您发现文档中的任何内容不正确、与您特定功能的使用体验不符或需要进一步澄清,请使用此表格报告文档问题。