のような単純なものが必要です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()は、以前にシードとして使用された値を返します。
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 ))
これは@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 とは完全に別のものです。
%Ngnuの日付の小数秒について述べたオプションがMacOSの日付から欠落しています。10.14では、manページにはどのフォーマットもありません。それらはstrftime(3)manページにあります。Xcodeがインストールされていない場合は表示されず、manコマンドを使用しても表示されない場合があります。