Solaris 11 中的日期显示

Das*_*mar 2 solaris date

# 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到这里?如何纠正?请帮忙。

Sté*_*las 6

可能是因为您在 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)