日付/時刻をエポックに変換するには?

日付/時刻をエポックに変換するには?

時代を日付/時刻に変換するには、次のことができることを確認しました。

date -d  @1346338800 +'%Y%m%d%H%M%S'

Linuxでは、どのようにその逆を実行できますか? IE 20191027163020をエポック値に変換しますか? Pythonや他のプログラミング言語スクリプトを使用せずに実行できますか?

答え1

Linuxコアだけがあり、Q&Aとは関係ありません。

busyboxを介して実装されましたdateGNUはdate同様のオプションの実装も検討しています。; GNUとbusyboxは、dateLinuxをカーネルとして使用するシステムの2つの一般的な実装であり、あなたの構文をサポートしていることdate -d @xxxを知っています。

$ date -D %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820

ast-openを使用して実装されていますdatedateast-openの一部として構築されている場合は組み込みksh93と同じです):

$ date -p %Y%m%d%H%M%S -d 20191027163020 +%s
1572193820

組み込みstrftimezsh

$ zmodload zsh/datetime
$ strftime -r %Y%m%d%H%M%S 20191027163020
1572193820

現在のバージョンのGNUを使用すると、/supported形式(たとえば)dateに変換できます。-d-f2019-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オプションを除く)、-Doptions 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

関連情報