只需使用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 ))
或等效地使用temp变量(外部子shell是可选的,但保持环境变量干净)。
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
注意:尽管手册页指出%()T
格式化程序的任何参数都不会采用默认值-1
,但我似乎得到了0(谢谢,bash手册版本4.3.48)