web-dev-qa-db-ja.com

Linuxのエポック、Bashからの現在の時間を秒数で取得する

私はdateのような単純なものが必要ですが、現在の日付、時間、分、秒の代わりに1970年からの秒数です。

dateはそのオプションを提供していないようです。簡単な方法はありますか?

509
n-alexander

これはうまくいくはずです。

date +%s
946
Steef

追加するだけです。

特定の日付(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

112
pellucide

これまでのところ、すべての答えは外部プログラム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は現在の日付の代わりにシェルが開始された時間を使用します(しかし、なぜこれが欲しいですか?).

32
gniourf_gniourf

ほとんどのAwkの実装では:

awk 'BEGIN {srand(); print srand()}'
17
Steven Penny

これは@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

17
PeqNP

ピュアバッシュソリューション

bash 5.0以降( 2019年1月7日にリリースされた )、組み込み変数EPOCHSECONDSを使用できます。

$ echo $EPOCHSECONDS
1547624774

秒の端数を含むEPOCHREALTIMEもあります。

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEは、小数点を削除することによってマイクロ秒(μs)に変換できます。整数しか扱えないbashの組み込み算術(( expression ))を使うとき、これは興味深いかもしれません。

$ echo ${EPOCHREALTIME/./}
1547624774371215

上のすべての例で、読みやすさのために印刷された時間の値は同じです。実際には、各コマンドの実行には少し時間がかかるため、時間の値は異なります。

6
Socowi

この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" "$@"
0
comonad