使用してdate
、信頼できる秒数:
あなたが正しく指摘しているように、英語の時間計算に依存している場合、基礎となる計算に関する詳細の多くは隠されています。たとえば-d yesterday
、-d 1 day ago
動作が異なります。
代わりに、UNIXエポックUTC以降の(正確に文書化された)秒に確実に依存し、必要な瞬間を取得するためにbash演算を実行できます。
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
これは別の答えで指摘されました。このフォームはdate
、コマンドラインフラグが異なるプラットフォーム間でより移植性が高く、言語に依存しません(たとえば、フランス語のロケールでは「昨日」と「それ以上」)。率直に言って(長期的に)覚えやすいでしょう。すでに知っています。あなたは、そうでない場合は、自分自身を求め続けるかもしれません:「それがあった-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変数と同等です(外部サブシェルはオプションですが、環境変数をクリーンに保ちます)。
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
注:%()T
フォーマッターへの引数はデフォルトを想定しないとマンページに記載されていますが、-1
代わりに0を取得するようです(ありがとう、bashマニュアルバージョン4.3.48)。