これまでの入力形式を指定する方法は?

これまでの入力形式を指定する方法は?

認識できない形式の日付と時刻が与えられた場合、その日付と時刻をどのようにdate認識できますか?date

たとえば、

$ date -d "09SEP2012:23:58:46"
date: invalid date `09SEP2012:23:58:46'
$ date -d "09SEP2012:23:58:46" --magic-option "ddMMMYYY:hh:mm:ss"
Sun Sep  9 23:58:46 MDT 2012

存在しますか--magic-option?そうでなければ、sed入力を正しい形式の日付文字列に変換するよりも、この問題を解決するためのよりエレガントな方法はありますか?

答え1

POSIXやGNU Date --magic-optionFreeBSDはそれを呼び出しません(提案された構文ではなく出力書式指定子に-f似た構文で)。date

あなたの日付がGNU Dateで認識されるのに非常に近いです。やるべきことは、日付と時刻を区切るコロンを空白に置き換えることだけです。

date -d "$(echo "09SEP2012:23:58:46" | sed 's/:/ /')"

答え2

たくさんのツールを書いています(日付ツール)日付と時刻をよりスクリプトに優しい方法で処理します。あなたの魔法のオプションは--input-format|-i次のとおりです。

dconv -i '%d%b%Y:%H:%M:%S' "09SEP2012:23:58:46"
=>
  2012-09-09T23:58:46

dconv出力形式は直接サポートされていませんが(環境では何もdate与えません)、ツールがあります。TZstrptime日付ツール書式指定子をサポートします%Z

答え3

すでにインストールされているUbuntuなどの環境を使用している場合は、次の手順をbusybox実行できます。busybox date -D "$input_format" -d "$input"

$ busybox date -D "%m/%d/%Y %H:%M:%S" -d "02/27/2013 23:48:00"
Wed Feb 27 23:48:00 CST 2013

出力文字列の形式を次のように指定する場合何か非標準的なものbusybox date -D "$input_format" -d "$input" +"$output_format"たとえば、次のように出力形式を指定できます。

$ busybox date -D "%m/%d/%Y" -d "02/27/2013" +"%d.%-m.%y"
27.2.13

ただし、ISO-8601準拠の日付の場合は、-I希望の精度レベルを使用してください。たとえば、次のようになります。

$ busybox date -D "%m/%d/%Y %H:%M:%S" -d "02/27/2013 23:48:00" -Iseconds
2013-02-27T23:48:00-0600

ノート

これビジーボックスのマニュアルページ。これ動作しない可能性があります%Zタイムゾーン形式があります。

関連情報