只需使用date
可靠的秒数:
正如您正确指出的那样,如果您依赖英语时间算术,则有关基础计算的许多细节都将被隐藏。例如-d yesterday
, 并且-d 1 day ago
会有不同的行为。
相反,您可以可靠地依赖自 unix 纪元 UTC 以来的(精确记录的)秒数,并使用 bash 算法来获得您想要的时刻:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
另一个答案中指出了这一点。这种形式在具有不同命令行标志的平台上更便携,与date
语言无关(例如,法语语言环境中的“昨天”与“hier”),坦率地说(从长远来看)更容易记住,因为好吧,你已经知道了。否则,您可能会不断问自己:“是这样-d 2 hours ago
还是-d 2 hour ago
再次?” 或“是我想要的吗?”)-d yesterday
。-d 1 day ago
这里唯一棘手的地方是@
.
用 bash 武装,别无其他:
仅在 bash 上进行 Bash,您还可以通过 printf 内置函数获取昨天的时间:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
所以,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
或者,等效地使用临时变量(外部子外壳可选,但保持环境变量清洁)。
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
注意:尽管手册页声明%()T
格式化程序的任何参数都不会假定为默认值-1
,但我似乎得到了一个 0 代替(谢谢,bash 手册版本 4.3.48)