このdate
プログラムを使用して真夜中からの秒数を計算するにはどうすればよいですか?
答え1
競合状態を避けるために、GNUの日付はまだ仮定されています。
eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"
以下を使用して、zsh
内部的にこれを実行できます。
zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))
夏時間スイッチがない時間帯では便利に次のようにできます。
eval "$(date +'h=%H m=%M s=%S')"
echo "$((${h#0} * 3600 + ${m#0} * 60
+ ${s#0}))"
それがすることは先行ゼロを削除することですが、これは 、${X#0}
などの一部のシェルで問題を引き起こします (シェルが無効な 8 進数と文句を言うところ)。bash
dash
posh
08
09
答え2
算術式は必要なく、通常の日付のみを使用できます。
date -d "1970-01-01 UTC $(date +%T)" +%s
答え3
に基づいてbash、真夜中以降の現在時刻をミリ秒単位で取得します。、GNUシステムでは、次のように実行できます。
$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
答え4
真夜中から何秒経ちましたか?
Bash(GNUを使用date
)の場合、以下は同じ有効な2つのシングルライナーです。
echo $(( - $(date -d 0 +%s) + EPOCHSECONDS ))
または
echo $(( $(date '+%-H *3600 + %-M *60 + %-S') ))
どちらもうまく機能します。
同様に、深夜から数分間関数を実行するのが便利だと思います。
minutes () { echo $(( $(date '+%-H *60 + %-M') )) ;}