我可以给 GNU date 一个日期和该日期的格式字符串,并告诉它从中减去一些时间吗?似乎我可以在 1 个命令中完成 3 个中的 2 个,但不是全部
我有这个日期格式:
09/Sep/24 05:02 AM
我需要从中减去 1 天:
例如:
09/Sep/24 05:02 AM
-1 day ago
应该产生08/Sep/24 05:02 AM
我已经尝试过所以,这是计算结果:
date "+%m/%d/%y %H:%M %r" -d "1 hour ago"
并产生
09/09/24 14:52 02:52:30 PM
(很好,只是我没有告诉它生产第二个)
这根本不起作用
date "+%m/%b/%y %H:%M %r" -d "09/Sep/24 05:02 AM"
date: invalid date ‘09/Sep/24 05:02 AM’
即使这样:
date "+%m/%b/%y %H:%M %r"
09/Sep/24 15:55 03:55:49 PM
再次,包括我不想要的秒数。
根据这篇文章,以下应该有效:
date -d "09/Sep/24 05:02 AM - 2 hours" '+%m/%b/%y %H:%M %r'
date: invalid date ‘09/Sep/24 05:02 AM - 2 hours’
是否可以用一行代码用 gnu date 完成此操作?
info date 'date input formats'
将告诉您 GNUdate
接受哪些日期格式作为输入(对于最新版本的 GNU coreutils也一样)。并且
09/Sep/24 05:02 AM
不是它能识别的格式之一。任何未指定 UTC 偏移量的日期格式也是不明确的,因为您不知道它指的是哪个时区,即使我们假设是当地时间,一年中也有些时候我们无法知道是冬令时还是夏令时(对于那些适用 DST 的时区)。有关输出格式,请参见此处。
所以,这取决于语言环境。查看输出以
locale t_fmt_ampm
了解您所在语言环境中的情况。在我的语言环境中:它确实包括秒。
一种明确的格式,易于解析并被许多东西识别,包括 GNU、BSD、busybox、toybox、ast-open 的
date
、zsh
以及所有语言的strftime
内置函数、ksh93/bash 的纪元时间(自 1970-01-01 00:00:00 +0000 以来的 Unix 秒数)以十进制表示,但取决于工具,在指定为输入时printf %T
需要在前面加上#
或。@
一种格式是人类可读的,并被许多事物支持作为输入格式,包括大多数
date
接受日期作为输入的实现,除了设置时钟之外,都接受这些格式,即YYYY-MM-DD HH:MM:ZZ {+,-}ZZZZ
以 ISO 8601 变体的形式生成date '+%F %T %z'
。(对于 busybox,
ENABLE_FEATURE_TIMEZONE
必须在构建时启用)为了能够使用任意日期格式作为输入,您需要一个
date
支持指定输入格式的工具或实现(标准+fmt
是针对输出格式的,顺便说一下,应该位于选项之后,因为它是非选项参数)。这包括带有date
选项-p
busybox 的ast-opendate
(如果已编译) ,带有 的-D
BSD ,zsh 的,带有环境变量的 ksh93 (也是 ast-open 的),但不包括 GNU (但是,请参阅考虑该功能的过去讨论或此错误请求)。date
-jf
strftime -r
printf %T
date
$DATEMSK
date
还要注意,像 这样的字符串
Sep
依赖于语言环境。因此,要解析英文字符串,您需要将语言环境设置为以英语为语言的环境(C
在本例中可以是语言环境)。(这些假定日期指的是我的当地时间)。
请注意格式说明符,其中有些
strptime()
仅覆盖了部分的子集strftime()
。现在,当要对这些进行计算时,它的可移植性就变得更差了。GNU 和 ast-open
date
/ksh93printf
支持一些相对时间规范的语法,但它们之间的语法有所不同。BSDdate
有一个更正式、更明确的方法来使用它们的-v
选项。最简单的方法通常是使用纪元时间,这样你就可以得到整数秒数。你可以这样做:
zsh 的
strftime
内置功能非常适合如果您必须使用 GNU
date
,由于该实现不支持指定输入格式,您需要将 转换$datetime
为它识别的格式。例如09 Sep 2024 05:02 AM
(适用于 GNU 或 ast-opendate
,不适用于其他date
实现),我们只需将/
s 替换为空格即可。这里使用支持 ksh93 运算符的 shell,
${param//pattern/replacement}
例如 ksh93、zsh、bash、mksh、yash:或者使用 GNU
date
的内置支持来计算日期偏移量:以打印不含秒的月份缩写名称的格式获取它:
输出:
获取月份数字:
输出:
格式
%I:%M %p
打印不带秒的 12 小时时间,而%r
打印带秒的时间。另外,请注意,我的命令中的日历日期是用和打印的
+%d/%b/%y
,+%d/%m/%y
它们分别打印星期数、月份数和两位数年份以及星期数、年份的缩写月份和两位数年份。您有+%m/%d/%y
一个例子和+%m/%b/%y
另一个例子。它们实际上打印的是月份数、月份日数和两位数年份,接下来是月份数、月份的缩写名称和两位数年份。它看起来像是在打印星期、月份和年份,因为今天的月份日和月份数(九月)是同一个数字。为了更好地说明这一点,如果你使用命令
您将看到输出是
这表明月份实际上是第一个数字,而您希望它是第二个数字。
请记住,时间有点偏差,因为它们是我运行命令的时间。