
私はSun OS環境で作業しており、ファイル(%Y%m%d形式)から日付を読み、1日を追加して書き換える機能を既存のunix kshスクリプトに追加したいと思います。ファイル内のファイル。 [注:現在の日付に日付を追加するのではなく、ファイルに存在するi / p日付に1日を追加したいです。]例:DateFile.dat 20200620スクリプトの実行が終わったら、スクリプトを20200621に変更したいと思います。ただし、i / p日付を含む変数に1日を追加するとエラーが発生します。
#!/bin/ksh
ip_dte</home/{file_Path}
echo $ip_dte
dte_add=`TZ=AEST-24 "$ip_dte"`
echo $dte_add
答え1
パールの使用:
perl -MPOSIX=strftime -MTime::Local -lne '
/^(\d{4})(\d{2})(\d{2})$/ or die "Cannot parse time: $_\n";
($year, $month, $day) = ($1, $2, $3);
$time = timelocal 0, 0, 12, $day, $month-1, $year-1900;
$time += 86400; # add one day
print strftime("%Y%m%d", localtime $time);
' datefile
インストールされているPerlバージョンが5.10以降の場合は、次のことができます。
perl -MTime::Piece -MTime::Seconds -lne '
$fmt = "%Y%m%d";
$time = Time::Piece->strptime($_, $fmt) or die "Cannot parse time: $_\n";
$time += ONE_DAY;
print $time->strftime($fmt);
' datefile
答え2
cal
カレンダーツールを使用すると、明日の日付を簡単に計算できます。関数ですが、書き換えbash
は難しくありません
tomorrow() {
local y=$1 m=${2#0} d=${3#0}
((++d))
if cal $m $y | xargs | sed -e 's/$/ X/' -e 's/ */ /g' | grep -v " ${d#0} " >/dev/null
then
d=1
[[ $((++m)) -gt 12 ]] && m=1 && ((++y))
fi
printf "%d %d %d\n" $y ${m#0} ${d#0}
}
これにより、明日の日付を簡単に知ることができます
# Get today's date into $y $m $d
IFS='-' read -r y m d <<<"2020-06-29"; echo y=$y m=${m#0} d=${d#0}
y=2020 m=6 d=29
tomorrow $y $m $d
2020 6 30
任意の日付を使用する別の例
tomorrow 2020 6 30
2020 7 1
tomorrow 2020 2 28
2020 2 29
tomorrow 2019 2 28
2019 3 1
補助機能です
yesterday() {
local y=$1 m=${2#0} d=${3#0}
if [[ $((--d)) -eq 0 ]]
then
# Go back one month and find the last day
[[ $((--m)) -eq 0 ]] && ((--y)) && m=12
d=$(cal ${m#0} $y | xargs | awk '{print $NF}')
fi
printf "%d %d %d\n" $y ${m#0} ${d#0}
}
答え3
このようなものを使用すると、新しいタイムゾーンの名前とタイムゾーンオフセットTZ=XXX-24
として使用されます。XXX
GMT+24
ヨーロッパの夏時間などの希望の時間を取得するには、MET-26
ヨーロッパの冬の時間を指定する必要がありますMET-25
。