私はdate
のような単純なものが必要ですが、現在の日付、時間、分、秒の代わりに1970年からの秒数です。
date
はそのオプションを提供していないようです。簡単な方法はありますか?
これはうまくいくはずです。
date +%s
追加するだけです。
特定の日付(1973年10月21日など)について、エポック(1970年1月1日)からの経過秒数を取得します。
date -d "Oct 21 1973" +%s
秒数を日付に戻す
date --date @120024000
コマンドdate
はかなり用途が広いです。日付を使ってできるもう1つの素晴らしいこと(date --help
から恥知らずにコピー)。米国の西海岸で、来週の金曜日の9AMに現地時間を表示します。
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
もっと良いのは、manページを読むのに時間がかかる http://man7.org/linux/man-pages/man1/date.1.html
これまでのところ、すべての答えは外部プログラムdate
を使用しています。
Bash 4.2以降、printf
には新しい修飾子%(dateformat)T
が追加されました。これは、引数-1
と共に使用すると、dateformat
で指定された形式で現在の日付を出力し、strftime(3)
で処理されます(形式に関する情報はman 3 strftime
)。
それで、純粋なBashソリューションのために:
printf '%(%s)T\n' -1
あるいは結果を変数var
に格納する必要がある場合は、次のようにします。
printf -v var '%(%s)T' -1
外部プログラムやサブシェルはありません。
Bash 4.3以降、-1
を指定しないことも可能です。
printf -v var '%(%s)T'
(しかしそれでも引数-1
を与えるのは賢明かもしれません)。
-2
の代わりに-1
を引数として使用すると、Bashは現在の日付の代わりにシェルが開始された時間を使用します(しかし、なぜこれが欲しいですか?).
ほとんどのAwkの実装では:
awk 'BEGIN {srand(); print srand()}'
これは@pellucideが行ったことの拡張ですが、Mac用です。
特定の日付(1973年10月21日など)について、エポック(1970年1月1日)からの経過秒数を求める
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
完全を期すために、フォーマットに時間部分を追加しました。その理由は、date
はあなたが与えた日付の部分をすべてとり、与えられた値に current timeを加えるからです。たとえば、午後4時19分に '00:00:00'の部分なしで上記のコマンドを実行すると、時間が自動的に追加されます。 「1973年10月21日」は「1973年10月21日16時19分00秒」として解析されるように。それはあなたが望むものではないかもしれません。
タイムスタンプを日付に戻すには:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
日付の実装に関するAppleのmanページ: https://developer.Apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
bash
5.0以降( 2019年1月7日にリリースされた )、組み込み変数EPOCHSECONDS
を使用できます。
$ echo $EPOCHSECONDS
1547624774
秒の端数を含むEPOCHREALTIME
もあります。
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
は、小数点を削除することによってマイクロ秒(μs)に変換できます。整数しか扱えないbash
の組み込み算術(( expression ))
を使うとき、これは興味深いかもしれません。
$ echo ${EPOCHREALTIME/./}
1547624774371215
上のすべての例で、読みやすさのために印刷された時間の値は同じです。実際には、各コマンドの実行には少し時間がかかるため、時間の値は異なります。
このbashスクリプト(私の~/bin/Epoch
)を使ってください。
#!/bin/bash
# get seconds since Epoch
test "x$1" == x && date +%s && exit 0
# or convert Epoch seconds to date format (see "man date" for options)
Epoch="$1"
shift
date -d @"$Epoch" "$@"