GNUツールなしで日付を計算する

GNUツールなしで日付を計算する

シェルスクリプトでいくつかの日付の計算と変換を実行する必要があります。たとえば、今日の形式の日付と今日Nov 28 20:27:19 2012 GMTの日数の差を計算します。

いくつかの可能性(GNU、、、など)がありますが、dateGNUツールなしでシステム(BSD、Solarisなど)で実行できることを願っています。gawkperl

私が現在持っている最も移植性の高いソリューションはPerlですが、日付変換のために追加のモジュールをインストールする必要があるかもしれません。

何を選ぶべきですか?

編集する:コメントを見ると、私が作成しているツールが公開されていることを明確にする必要があることに気づきました。私は自分のコンピュータで計算を実行する方法やGNUツールをインストールする方法を探していません。

ほとんどのコンピュータで見つけることができるツールを使用したいと思います。

ベストアンサー1

私の解決策は短いです。以前は、C、Lua、Python、Perl、Awk、Ksh、およびCshのバージョンを作成しました(以下のバージョンはkshです)。ansi_dn、nd_isna、およびdowを使用して、いくつかの特定の質問に答えることができます。日付YYYY MM DD、100日前後の日付はいつですか?日付が与えられたら、その曜日は何日ですか? 2つの日付が与えられると、その間に数日がありますか?

#==========================================================================
# Calendar operations: Valid for dates in [1601-01-01, 3112-12-30].
# Adapted from a paper by B.E. Rodden, Mathematics Magazine, January, 1985.
#==========================================================================
# ANSI day number, given y=$1, m=$2, d=$3, starting from day number 1 ==
# (1601,1,1).  This is similar to COBOL's INTEGER-OF-DATE function.
function ansi_dn {
  integer y=$1 ys=$(($1-1601)) m=$2 d=$3 s dn1 isleap h
  ((isleap = y%4==0 && (y%100!=0 || y%400==0) ))
  ((dn1 = 365*ys + ys/4 - ys/100 + ys/400)) # first day number of given year.
  ((s = (214*(m-1) + 3)/7 + d - 1)) # standardized day number within year.
  ((h = -2*(!isleap && s>58) - (isleap && s>59) )) # correction to actual dn.
  print -- $((1 + dn1 + s + h))
}
# Inverse of ansi_dn, for adn=$1 in [1, 552245], with returned dates in
# [1601-01-01, 3112-12-30].  Similar to COBOL's DATE-OF-INTEGER function.
function nd_isna {
  integer y a s ys d0=$(($1-1)) dn1 isleap h
  typeset -Z2 m d
  ((ys = d0/365))
  ((365*ys + ys/4 - ys/100 + ys/400 >= $1)) && ((ys -= 1))
  ((dn1 = 365*ys + ys/4 - ys/100 + ys/400))
  ((y = 1601 + ys))
  ((a = d0 - dn1))
  ((isleap = y%4==0 && (y%100!=0 || y%400==0) ))
  ((h = -2*(!isleap && a>58) - (isleap && a>59) ))
  ((s = a - h))
  ((m = (7*s + 3)/214 + 1))
  ((d = s - (214*(m-1) + 3)/7 + 1))
  print -- $y $m $d
}
# Day of the week, given $1=ansi_dn.  0==Sunday, 6==Saturday.
function dow { print -- $(($1%7)); }

おすすめ記事