私はコマンドdate -d "20170712"
が日付を確認して文字列として返すことを理解していますWed Jul 12 00:00:00 PDT 2017
。
私の質問は次のとおりです
日付は私が提供した文字列の形式をどのように理解できますか?(この場合、年は2107、月は7月、日は12です)
また、「20171307」を渡し、日付が13日で月が7月であることを関数に知りたい場合はどうすればよいですか?
date
コマンドに渡される文字列をフォーマットする方法はありますか?
ベストアンサー1
GNUはdate
入力内容を解析するために最善を尽くしますが、いくつかの形式は本質的にあいまいです。
BSDはdate
入力フォーマットを指定することを許可(または実際に要求)し、その-f
フォーマットに従って入力を解析し、入力がフォーマットと一致しない場合にエラーを発生させます。
それにもかかわらず、あなたのような非論理的でランダムな日付形式をサポートするために標準ツールを期待または要求するのは間違っているようです。標準ツールは標準形式をサポートする必要があり、長期的に見ると、スクリプトとプログラムが内部的にコンピュータフレンドリーな形式を使用するのが合理的であることがわかります。奇妙な行動をしている人間と対話するには、単純なシェルラッパー関数を作成するのは簡単です。
Wackydate () {
local day # local is a Bashism
local mon
local year
year=${1%????}
mon=${1#$year??}
day=${1#$year}
day=${day%$mon}
shift
date -d "$year$mon$day" "$@"
}
シェルの引数は、それぞれ先頭または末尾から削除されたワイルドカード文字に一致する値を置き換えて${variable#prefix}
返します。${variable%suffix}
variable
#
%