Solaris UNIXに日付を引くことができるツールはありますか(したがってGNUツールは利用できません)? Linuxでは、gawk
別の日付から1つの日付を引くことができることを知っています。ただし、Solarisでは日付計算を実行できない最大値はnawk
(improved)です。awk
パールも使えません。
日付を計算する方法はありますか20100909 - 20001010
?
更新:bc
日付計算を実行できますか?
答え1
残念ながら、日付操作を提供するPOSIXコマンドラインユーティリティはありません。あなたがそれを持っていてdate -d
最善date +%s
の選択であれば、それはGNU拡張です。
touch
日付が少なくともn日前であることを確認する不器用なハッキングがあります。
touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...
(間隔中にDSTが起動または停止され、スクリプトが午前1時前に実行されると、このコードは1がオフになる可能性があります。)
一部の人々は最終的にBourneまたはPOSIXシェルに日付操作ライブラリを実装するようになりました。いくつかの例とリンクがあります。comp.unix.shell FAQ。
GNUツールをインストールすることはおそらく労働集約的ではない方法です。
答え2
date
ほとんどすべての場所で動作するようにPOSIXの一部であるコマンドを使用しようとしています。更新:残念ながら、-dはPOSIX日付の一部として表示されず、Solarisには存在しない可能性があります。したがって、これはOPの質問に答えることができないかもしれません。
d1=`date -d 20100909 +%s`
d2=`date -d 20001010 +%s`
Nowd1
とは、d2
UNIX時代以降の秒数に対応する整数です。したがって、2つの間の差を得るには($((d1-d2))
bashから)減算し、目的の単位に変換します。人生は最も簡単です。
echo "$(((d1-d2)/86400)) days"
bashがない場合、変換方法は異なる場合があります。最も移植性の高い方法はおそらくexpr
(expr の posix マニュアルページ)。
答え3
これは、POSIX awkで使用する必要がある先ほど作成したawkスクリプトです。 Solarisバージョンを試してください。 Solarisには2つのバージョンのAwkがあることを覚えておいてください。 1つは/binにあり、もう1つは/usr/xpg4/bin/awkにあります(どうしてもそうではありません)。
BEGIN {
daysofmonth["01"] = 0; daysofmonth["02"] = 31; daysofmonth["03"] = 59;
daysofmonth["04"] = 90; daysofmonth["05"] = 120; daysofmonth["06"] = 151;
daysofmonth["07"] = 181; daysofmonth["08"] = 212; daysofmonth["09"] = 243;
daysofmonth["10"] = 273; daysofmonth["11"] = 304; daysofmonth["12"] = 334;
fullday = 86400;
}
/[12][09][0-9][0-9][01][0-9][0123][0-9]/ {
year = substr($0, 1, 4); month = substr($0, 5, 2); day = substr($0, 7, 2);
date = ((year - 1970) * 365.25) + daysofmonth[month] + day - 1;
if ((year % 4) == 0 && month > 2) { date = date + 1; }
print date * fullday - (25200);
}
{}
YYYYmmdd日付文字列を渡すと、epoch以降の秒に変換されます(日の境界に点が割り当てられます)。その後、2つを引くことができます。
today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`