私たちのナイトリー ビルド システムでは、計算を行う C プログラムを作成しました (日付を基準日からの日数として格納する独自のローカル ライブラリを使用)。基本的に、(不変の) 基準日を指定すると、基準日からの日数がレポートされます。したがって、cron
スクリプトには最初の日が組み込まれており、プログラムはそれからの日数を報告します。
このシステムの大きな利点は、基準日が (非常に頻繁に) 変更されないため、スクリプトが (非常に頻繁に) 変更されず、情報を保存する外部ファイルがないことです。
標準の Unix ツールで同じ効果を実現する方法はおそらくあると思いますが、私は腰を据えて移植可能なソリューションを考え出したわけではありません。おそらく、Perl を使用する条件だと思います。(C プログラムは 2999 CE までしか動作しません。私は、Y3K 修正の問題になる約 50 年前に人々が私に連絡するように、コードにメモを残しました。それはおそらく些細なことです。)
おそらく、Unix タイムスタンプの観点から作業することができます...
数値を基準日として扱い、現在のタイムスタンプを取得するスクリプト 'days_since 1234567890' を作成します (date
適切な形式の仕様から; Linux ではdate '+%s'
その仕事を行い、Mac OS X でも動作します)、差を取り、 86,400 (1 日の秒数) で割ります。
refdate=1234567890
bc <<EOF
scale=0
($(date '+%s') - $refdate) / 86400
EOF
例:
$ timestamp 1234567890
1234567890 = Fri Feb 13 15:31:30 2009
$ timestamp
1330027280 = Thu Feb 23 12:01:20 2012
$ refdate=1234567890
$ bc <<EOF
> scale=0
> ($(date '+%s') - $refdate) / 86400
> EOF
1104
$
したがって、基準日が 2009 年 2 月 13 日である場合、今日は 1104 日目ですbc
。これは、もともと1980 年代初頭に機能を持っていた以前に書かれtimestamp
た特殊なバリアントです。)date
date
Perl のワンライナー (スクリプトで基準日を指定すると仮定):
perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)'
また:
days=$(perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)')