日付コマンドの変数

日付コマンドの変数

dateコマンド内で変数を使用したいと思います。私のシステムはGNU日付をサポートしていません。私はSunosを使用していますが、datewithオプションを使用すると誤った代替項目として-d表示されます。-d

#!/usr/bin/ksh
RELEASE_DATE="28 OCT 2018" 
RELEASE_DATE_MINUS_2=`date -"${RELEASE_DATE: -2} ${RELEASE_DATE:4:3} ${RELEASE_DATE:0:4} - 2 days" '+%Y-%m-%d'`
echo "Release is $RELEASE_DATE" 
echo "release_date-2 is $RELEASE_DATE_MINUS_2

上記のコードスニペットを試してみました。release_dateこの入力など、他のファイルから取得した実際のデータを渡す必要があり、その日付の2日前にそのような入力を受け取る必要があります。.cnf28OCT20182018-10-26

答え1

シェルを含むzsh:

zmodload zsh/datetime
rel_date=2018OCT28
strftime -rs d %Y%b%d.%H $rel_date.12 &&
  strftime -s two_days_before %Y-%m-%d $((d - 86400*2)) || exit

echo $two_days_before

答え2

Perl は次の目的で使用できます。

perl -MTime::Piece -slE 'say +(Time::Piece->strptime($date, "%Y%b%d") - 2 * 86_400)->ymd' -- -date="$rel_date"

着信日付変数の形式を指定してそれを時間オブジェクトとして解析し、日付算術を実行してから必要なYYYYY-mm-dd形式で出力します。

ここで録音されました:https://perldoc.perl.org/Time/Piece.html

答え3

シェルでタグ付けしたので、変数がシェルにある必要があると仮定しますが、参考までにシェル=変数の周りにスペースを含めることはできません。

GNUはdateその形式の入力日付を受け入れませんが、許可するので、28 OCT 2018シェル引数拡張を使用して日付を並べ替えることができます(常に同じ形式である限り)。

date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4}"

これで2日を引くには、次のように追加します。

date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4} - 2 days" 

要求された形式で出力します。

date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4} - 2 days" '+%Y-%m-%d'

答え4

どのksh {88,93}を使用しているかを知ることが役に立ちます。

ksh93(1) によると、日付に関するいくつかの情報を見つけることができます。

 printf format [ arg ... ]
 %(date-format)T

-- 実用的な例

: printf "%(%d.%m,%Y)T\n"             
11.01,2019
: printf "%(%d.%m.%Y)T\n" "2 days ago"
09.01.2019

関連情報