web-dev-qa-db-ja.com

シェルでの日付検証

シェルスクリプトで以下の日付形式を検証したい

2015-Jul-13

私はdate -d "2015-Jul-13" +"%Y-%b-%d"を使用していますが、エラーが発生しています

date: invalid date '2015-Jul-13'
14

GNU dateYYYY-MMM-DDをサポートしていません。ただし、DD-MMM-YYYYは理解します。したがって、この形式の日付を本当に処理する必要がある場合は、次のようなものでそれを行うことができます。これは、dateが期待する形式に引数を交換するだけです。

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

これがオールシェルソリューションです。分解すると、IFS=-命令はシェルに、次のコマンドラインを空白文字ではなくハイフン-で分割するように指示します。 set $ymdは、コマンドラインの場合と同様に$ymd変数を解析しますが、ハイフンで分割され、パラメーターに値を割り当てます$1$2et seq =。 echo "$3-$2-$1"は、取得した3つの値を逆の順序で簡単に出力します。

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi
12
roaima

マンページから:-

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

しかし、YYYY-MMM-DD形式を認識しないようです。したがって、以下から、または同様のように使用できます。

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

または、変換する必要があります/ 再フォーマットdateに送信する前に変換してください!

また参照 日付への入力のフォーマットをどのように指定しますか?


私は訪問することをお勧めします: 日付入力形式

ここにルールがあります。

数値の月の場合、ISO 8601形式の 'year-month-day'が許可されます。年は任意の正数、月は01から12であり、日は01から31までの数値です。数値が10未満の場合は、先行ゼロが必要です。年が68以下の場合、2000が追加されます。それ以外の場合、年が100未満の場合は1900が追加されます。米国で人気のある「月/日/年」という構成が受け入れられます。また、年を省略して「月/日」。

リテラル月は、完全に綴ることができます:「1月」、「2月」、「3月」、「4月」、「5月」、「6月」 、「7月」、「8月」、「9月」、「10月」、「11月」または「12月」。リテラル月は、最初の3文字に省略される場合があり、その後に省略ドットが続く場合があります。また、「9月」の代わりに「9月」と書くこともできます。

月が文字どおりに記述されている場合、カレンダーの日付は次のいずれかで指定できます。

日月年
日月
月日年
日月年

私が強調した

ここには、year-month-dayのような形式がないことがわかります! (月は文字通り書かれています)

11
Pandya

zshを使用すると、zsh/datetime(逆)でstrftimeビルトイン(-rから入手可能)を使用できます。

strftime -r タイムストリングのフォーマット

formatを使用してtimestringを解析し、エポック以降の秒数を出力します。

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

これは、日付が無効な場合はエラーになります。

strftime -r %Y-%b-%d 2015-Jul-33
zsh:strftime:5:形式が一致しません

エポック以降の秒数を他の標準/カスタム日付形式に変換することもできます。

strftime '%A, %B %d, %Y' 1447970400
2015年11月20日金曜日
7
don_crissti