Linux、Bashのエポックから現在の時間を秒単位で取得します。


634

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

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


22
申し訳ありませんが、私はこれを言わなければなりません... ''日付はそのオプションを提供していないようです。簡単な方法はあります「」 - ?手動再読み込み;-)
TheBonsai

7
日付のバージョンによっては、あるものとないものがあります。したがって、常に存在するとは限りません。私は「type -a date」を実行し、別のバージョンを使用しましたが、うまくいきました。
Scott Rowley

1
FWIW、Ubuntuには/ bin / dateしかないため、@ Steefの回答が機能します
Jonathan Hartley

1
@TheBonsaiは、「日付」ツールのPOSIX標準バージョンの一部ではありません。あなたのバージョンに(おそらくGNU)があるからといって、みんなの実装がそうであると仮定すべきではありません。
Wyatt8740

回答:


1160

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

date +%s

45
そこに逃したので、日付のmanpgeをから%s seconds since 1970-01-01 00:00:00 UTCに変更する必要が%s seconds since the epoch, 1970-01-01 00:00:00 UTCあります。
デビン

3
うまくいきません。製造日には%sは表示されません。非常に古いバージョンのbash(Solarisの場合は3.2.51(1))が必要ですか?
livefree75 14年

7
@ livefree75 dateはに組み込まれていないbashため、のバージョンは、システムの出荷時の実装bashとは関係ありませんdate
エイドリアンFrühwirth

11
そして、9桁まで、あなたは第二の画分をしたい場合は、使用:date +%s.%N
ジョナサン・ハートリー

19
ミリ秒での使用date +%s%3N
Juan Campa

133

追加するだけです。

特定の日付(1973年10月21日など)のエポック(1970年1月1日)以降の秒数を取得します。

date -d "Oct 21 1973" +%s


秒数を日付に戻す

date --date @120024000


コマンドdateはかなり用途が広いです。あなたが日付でできるもう一つのクールなこと(恥ずかしくないようにからコピーされますdate --help)。米国西海岸の次の金曜日の午前9時に現地時間を表示

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

さらに良いことに、manページhttp://man7.org/linux/man-pages/man1/date.1.htmlを読んで ください


これはOPの質問ではありませんが、私の答えなので、+ 1してください。
AnthonyD973

多分それdatezsh(macOS Catalina)を使用しているため、または私が使用しているためですが、これは私にとっては機能しません。稼働中の$ date -d "Oct 21 1973" +%s出力usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter

43

これまでのところ、すべての回答は外部プログラムを使用していdateます。

Bash 4.2以降printf、新しい修飾子%(dateformat)Tが追加されました。引数とともに使用すると-1、現在の日付がで指定された形式で出力されdateformatstrftime(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は現在の日付の代わりにシェルが開始された時刻を使用します。これは経過時間の計算に使用できます

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422

9
あなたが使用したい-2と行うことができる-あなたは(あなたがバックアップを制御するスクリプトを考えて)長い実行中のジョブを持っている場合には、最後にメールを送信する「バックアップはsomewhen今$で終了し$で開始」-2格納することを回避します最初は専用変数。
Sebastian J.

23

ほとんどのAwk実装:

awk 'BEGIN {srand(); print srand()}'

21
わからない
ericslaw 2017年

8
うわー、これを調べに行かなければならなかった。これは実用的なソリューションですが、必ずしも優れている/移植性があるとは限りません。awkの実装にsrand()は通常、現在の日付/時刻がシードされているようです。の2番目の呼び出しsrand()は、以前にシードとして使用された値を返します。
Ryan Ransford 2017

23

純粋なbashソリューション

bash5.0(2019年1月7日にリリース)以降、組み込み変数を使用できますEPOCHSECONDS

$ echo $EPOCHSECONDS
1547624774

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

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIME小数点を削除することにより、マイクロ秒(μs)に変換できます。これは、整数のみを処理できるbashの組み込み算術(( expression ))を使用する場合に役立ちます。

$ echo ${EPOCHREALTIME/./}
1547624774371215

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


ミリ秒の解像度(と同じ形式date +%s%3N)を使用できますecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212

19

これは@pellucideが行ったことの拡張ですが、Macの場合:

特定の日付(たとえば、1973年10月21日)のエポック(1970年1月1日)以降の秒数を決定するには

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

完全を期すために、時間の部分をフォーマットに追加したことに注意してください。その理由は、dateあなたが与えた日付の部分を取り、提供された値に現在の時刻を追加するからです。たとえば、上記のコマンドを午後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


1
明確にするために、これはBSDのdateコマンドに対するdate -dものですが、示唆する解決策はすべてGNUに対するものdateです。macOSのBSDの日付はFreeBSDからのものであり、NetBSDおよびOpenBSDといくつかのオプションを共有しています。そして、これはbash とは完全に別のものです。
ghoti 2018

%Ngnuの日付の小数秒について述べたオプションがMacOSの日付から欠落しています。10.14では、manページにはどのフォーマットもありません。それらはstrftime(3)manページにあります。Xcodeがインストールされていない場合は表示されず、manコマンドを使用しても表示されない場合があります。
Dan Pritts

1

このbashスクリプトを使用します(my ~/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" "$@"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.