
次のコマンドを実行しようとすると、正しい出力が表示されます。
date --date="04/1/2022 7:1:00" +'%s'
output: 1648776660
ただし、別の日付(2022年1月29日)で同じ命令を実行しようとすると、間違った日付が表示されます。
date --date="29/1/2022 7:1:00" +'%s'
error: date: invalid date ‘29/1/2022 7:1:00’
最初の部分を考えるのに1ヶ月かかるからですか?この状況をどのように処理するのですか%s
?
これは29日が月であり、日付が無効と見なされるためです。 dd-mm-yyyy hh:mm:ssを別の日付形式に変換して%sを追加して秒を取得する方法はありますか?どんな提案でもお願いします
答え1
(GNU)デフォルトの入力形式date
はEメール日付形式です(読み取りRFC5322)。この形式はもともと以下で定義されていました。RFC-822のようにdd mmm yy
。ただし、mmm
3文字(英語)の月名を示します。拡張機能として、ほとんどのdate
プログラムでは数字mm/dd/yyyy
(月から)も受け入れます。POSIX日付で定義されているものと似ています。mmddhhmm[[cc]yy]
Ubuntu(オペレーティングシステム)では、デフォルトはdate
GNU Dateであり、このmm/dd/yyy
形式が必要です。現在、他の形式を定義する方法はありません(GNU coreutils 8.32)。
busyboxで利用可能な日付を使用して一般的な形式を解析できます。-D
Ubuntuにsudo apt-get install busybox
busyboxをインストールするために使用(後)します。sudo apt-get update -y
$ busybox date -D '%d/%m/%Y %H:%M:%S' --date='04/1/2022 7:1:00'
Tue Jan 4 07:01:00 IST 2022
あなたがインドにいるとします(IST時間または+5:30)。
もちろん、出力フォーマットを指定すると、+'%s'
エポック以降の秒数がわかります。これは UTC 時間ではなく IST 時間を提供します。
$ busybox date -D '%d/%m/%Y %H:%M:%S' --date='04/1/2022 7:1:00 +0530' +'%s'
1641259860
$ date -ud @1641259860
Tue 04 Jan 2022 01:31:00 AM UTC
時代がどう違うか注目してください!
他の場合(インド時間ではない)、次のように結果を再現できます。
$ TZ='Asia/Kolkata' busybox date -D '%d/%m/%Y %H:%M:%S' --date='04/1/2022 7:1:00' +'%s'
1641259860
-j
一部のBSD日付実装では、および-f
オプションを使用できます。同様の結果。
$ date -j -f "%d/%m/%Y %T" "04/1/2022 7:1:00" +"%s"
1641259860
答え2
これとは関係ありません+%s
。フォーマットをdate
解析できますか?dd/mm/yyyy
(マンページは設定値を指定しませんLC_TIME
)。
上記のエポックサンプルから
LC_TIME=C date -d@1648776660
Fri Apr 1 03:31:00 CEST 2022
1月4日または4月1日に試験を見ましたか? (そして時間は7:1:00と一致しません)
私の推測では、この日付が29/1/2022
2022年3月1日と解釈されるようです。
編集:--debug
オプションを使用して確認済み
$ date --debug --date="29/01/2022 7:1:00" +'%s'
date: warning: value 29 has less than 4 digits. Assuming MM/DD/YY[YY]
date: parsed date part: (Y-M-D) 2022-29-01
date: parsed time part: 07:01:00
date: input timezone: system default
date: using specified time as starting value: '07:01:00'
date: error: invalid date/time value:
date: user provided time: '(Y-M-D) 2022-29-01 07:01:00'
date: normalized time: '(Y-M-D) 2024-05-01 07:01:00'
date: ---- --
date: possible reasons:
date: numeric values overflow;
date: missing timezone
date: invalid date ‘29/01/2022 7:1:00’