時代を日付/時刻に変換するには、次のことができることを確認しました。
date -d @1346338800 +'%Y%m%d%H%M%S'
Linuxでは、どのようにその逆を実行できますか? IE 20191027163020をエポック値に変換しますか? Pythonや他のプログラミング言語スクリプトを使用せずに実行できますか?
答え1
Linux
コアだけがあり、Q&Aとは関係ありません。
busyboxを介して実装されましたdate
(GNUはdate
同様のオプションの実装も検討しています。; GNUとbusyboxは、date
Linuxをカーネルとして使用するシステムの2つの一般的な実装であり、あなたの構文をサポートしていることdate -d @xxx
を知っています。
$ date -D %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820
ast-openを使用して実装されていますdate
(date
ast-openの一部として構築されている場合は組み込みksh93と同じです):
$ date -p %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820
組み込みstrftime
:zsh
$ zmodload zsh/datetime
$ strftime -r %Y%m%d%H%M%S 20191027163020
1572193820
現在のバージョンのGNUを使用すると、/supported形式(たとえば)date
に変換できます。-d
-f
2019-10-27T16:30:20
t=20191027163020
printf '%s%s-%s-%sT%s:%s:%s\n' $(printf '%s\n' "$t" | fold -w2) |
date -f - +%s
すべて現地時間で動作します。タイムゾーンオフセットがフォーマットに含まれていないため、あいまいです。
たとえば、英国本土では、20191027011200が1572138720または1572135120である可能性があります。なぜなら、冬時間に切り替えると、時計は1時間間隔で2回01:12:00を表示するからです。
$ date -d @1572138720 +%Y%m%d%H%M%S
20191027011200
$ date -d @1572135120 +%Y%m%d%H%M%S
20191027011200
この問題を回避するには、常にUTC時間を使用することをお勧めします($TZ
環境変数をに設定するなど)。UTC0
答え2
通常、日付コマンド(-d
オプションを使用した実装)は次のようになります。一部ISO8601形式の日付文字列(エポック番号)。
$ date -d '2019-10-27 16:30:20'
Sun 27 Oct 2019 04:30:20 PM EDT
$ busybox date -d '2019-10-27 16:30:20' +%s
1572208220
ただし、一般的な形式の回答が必要な場合は、日付文字列を作成するための特定の形式を宣言する必要があります。これは、-f
オプション*BSD date
(-dオプションを除く)、-D
options busybox date
、ast-openオプション-p
、またはksh93の変数DATEMSKを介して実行できます。
date -j -f %Y%m%d%H%M%S 20191027163020 +%s # *BSD
busybox date -D %Y%m%d%H%M%S -d 20191027163020 +%s # busybox
date -p %Y%m%d%H%M%S -d 20191027163020 +%s # ast-open
DATEMSK=/dev/fd/3 3<<<%Y%m%d%H%M%S printf "%(%s)T\n" 20191027163020 # ksh93
GNU日付では、手動でフォーマットする必要があります。
$ t=20191027163020
$ T=$(echo "$t" | sed -E 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3T\4:\5:\6/')
$ echo "$T"
2019-10-27T16:30:20
$ date -d "$T" +%s
1572208220