# date +"%b %d %H:$(( $(date +'%M')-5))"
Nov 20 12:45
Run Code Online (Sandbox Code Playgroud)
date +"%b %d %H:$(( $(date +'%M')-55))"
Nov 20 12:-5
Run Code Online (Sandbox Code Playgroud)
我为什么-5
到这里?如何纠正?请帮忙。
可能是因为您在 12:50 运行它,其中date +%M
给您 50,当您减去 5 时变为 45,如果减去 55,则变为 -5。
在 12:00,第一个也会得到 -5。
在 12:07,你会得到12:2
而不是12:02
在 12:09,一些 shell 会抱怨这09
不是一个有效的八进制数。您不能仅在分钟字段中减去 5 以获得 5 分钟前的时间。考虑一下,例如 at Jan 1 00:00
,它应该给你Dec 31 23:55
。
对于 Solaris 上的日期计算,您可以使用perl
或者zsh
尽管默认情况下并不总是安装后者。要获取 5 分钟前的时间:
perl -MPOSIX -le 'print strftime("%b %d %R", localtime(time - 5*60))'
Run Code Online (Sandbox Code Playgroud)
或者:
zsh -c 'zmodload zsh/datetime; strftime "%b %d %R" $((EPOCHSECONDS - 5*60))'
Run Code Online (Sandbox Code Playgroud)
事实上,因为版本的Solaris 11,/bin/sh
和/bin/ksh
实际上是ksh93的,所以你也可以使用ksh
那里(最好不sh
作为而sh
被目前由ksh93的实现,这可能在未来改变和标准的sh
语言没有这些功能):
ksh -c 'printf "%(%b %d %R)T\n" "5 minutes ago"'
Run Code Online (Sandbox Code Playgroud)
正如@glennjackman 在评论中所指出的,如果您已经bash
安装,您还可以执行以下操作:
bash -c 'printf -v t "%(%s)T" -1 && printf "%(%b %d %R)T\n" "$((t - 5*60))"'
Run Code Online (Sandbox Code Playgroud)
(%s
在 Solaris 的第 11 版中也添加了对 bash 的最新版本的支持)。
虽然我们正在积累更多语言,但如果您有 TCL 解释器,例如expect
:
expect -c 'puts [clock format [
clock add [clock seconds] -5 minute] -format "%b %d %R"]'
Run Code Online (Sandbox Code Playgroud)
或者python3
:
python3 -c 'import time; print(time.strftime("%b %d %R", time.localtime(time.time() - 5*60)))'
Run Code Online (Sandbox Code Playgroud)