我可以使用date
以下命令进行一些日期运算
$ date -u -d '3 days 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
2024-12-04T00:00:00Z
$
该date
命令可以解析相当多的日期格式,包括 ISO-8601 格式。有没有一种简单的方法可以让它也能解释 ISO-8601 间隔?简单的方法失败了...
$ date -u -d 'PT3D 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
date: invalid date ‘PT3D 2024-12-01T00:00:00Z’
$
标准
date
实用程序不支持某个-d
选项。有一些实现支持该选项,但有时针对的是完全不同的东西。其中几个(包括现在的一些 BSD,尽管它们有自己的不同语法)都指定
-d
输入日期而不是采用系统时钟,遵循 GNUdate
的引导,但它们识别的输入格式不同。其中一些允许以时尚的方式指定输入格式strptime()
(ast-open、busybox、toybox),其他则不允许(GNU、NetBSD¹)。date
在支持指定输入日期的实现中-d
,我知道只有ast-open
(AT&T 软件技术,来自 AT&T 研究,原名为贝尔实验室,Unix 诞生地)支持 ISO8601 持续时间。但据我所知 ast-open 不再维护。但是
ksh93
,使用相同日期操作库的版本仍然保留,并且您可以使用其printf
内置函数来执行与 GNU 等效的操作date -d
:请注意,在日期计算时其 DST 处理仍然存在很多错误,尽管这并不适用于 UTC 日期。
要使其成为可在另一个类 Bourne shell 中使用的函数:
¹ 尽管 NetBSD 与其他 BSD 一样,允许使用 BSD 样式方式指定输入日期来指定输入格式。