のような単純なものが必要ですdate
が、現在の日付、時間、分、秒ではなく、1970年から数秒で。
date
そのオプションを提供していないようです。簡単な方法はありますか?
のような単純なものが必要ですdate
が、現在の日付、時間、分、秒ではなく、1970年から数秒で。
date
そのオプションを提供していないようです。簡単な方法はありますか?
回答:
これはうまくいくはずです:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
に変更する必要が%s seconds since the epoch, 1970-01-01 00:00:00 UTC
あります。
date
はに組み込まれていないbash
ため、のバージョンは、システムの出荷時の実装bash
とは関係ありませんdate
。
date +%s.%N
date +%s%3N
追加するだけです。
特定の日付(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を読んで ください
date
はzsh
(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]
これまでのところ、すべての回答は外部プログラムを使用してい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は現在の日付の代わりにシェルが開始された時刻を使用します。これは経過時間の計算に使用できます
$ 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
-2
と行うことができる-あなたは(あなたがバックアップを制御するスクリプトを考えて)長い実行中のジョブを持っている場合には、最後にメールを送信する「バックアップはsomewhen今$で終了し$で開始」-2
格納することを回避します最初は専用変数。
ほとんどのAwk実装:
awk 'BEGIN {srand(); print srand()}'
srand()
は通常、現在の日付/時刻がシードされているようです。の2番目の呼び出しsrand()
は、以前にシードとして使用された値を返します。
bash
5.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 ))
これは@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
date
コマンドに対するdate -d
ものですが、示唆する解決策はすべてGNUに対するものdate
です。macOSのBSDの日付はFreeBSDからのものであり、NetBSDおよびOpenBSDといくつかのオプションを共有しています。そして、これはbash とは完全に別のものです。
%N
gnuの日付の小数秒について述べたオプションがMacOSの日付から欠落しています。10.14では、manページにはどのフォーマットもありません。それらはstrftime(3)
manページにあります。Xcodeがインストールされていない場合は表示されず、manコマンドを使用しても表示されない場合があります。