2

ubuntuを実行しているマシンでiso-8601形式のエポックリストを生成する次のbash関数があり、正常に動作します。(入力をテストするための isdate および isint bash 関数)

gen_epoch()
{
 #@ USAGE: gen_epoch [start_date_iso] [end_date_iso] [increment_in_seconds]
 #@
 #@ TASK : generate an epoch list (epoch list in isodate format).
 #@        result on STDOUT:               [epoch_list]
 #@        error_code      :  2             0

 ## test argument
 if [ "$#" -ne 3 ]; then echo "$FUNCNAME: input error [nb_of_input]"; return 2
 elif [ $( isdate $1 &> /dev/null; echo $? ) -eq 2 ]; then echo "$FUNCNAME: argument error [$1]"; return 2
 elif [ $( isdate $2 &> /dev/null; echo $? ) -eq 2 ]; then echo "$FUNCNAME: argument error [$2]"; return 2
 elif [ $( isint $3 &> /dev/null; echo $? ) -eq 2 ]; then echo "$FUNCNAME: argument error [$3]"; return 2
 else local beg=$( TZ=UTC date --date="$1" +%s ); local end=$( TZ=UTC date --date="$2" +%s ); local inc=$3; fi

 ## generate epoch
 while [ $beg -le $end ]
 do
  local date_out=$( TZ=UTC date --date="UTC 1970-01-01 $beg secs" --iso-8601=seconds ); beg=$(( $beg + $inc ))
  echo ${date_out%+*}
 done
}

このコマンド ラインの例で期待される値が生成されます。 gen_epoch 2014-04-01T00:00:00 2014-04-01T07:00:00 3600

期待値:

2014-04-01T00:00:00
2014-04-01T01:00:00
2014-04-01T02:00:00
2014-04-01T03:00:00
2014-04-01T04:00:00
2014-04-01T05:00:00
2014-04-01T06:00:00
2014-04-01T07:00:00

ただし、ルート権限を持たないサーバーでこの機能を試したところ、次の結果が見つかりました。

2014-03-31T17:00:00
2014-03-31T18:00:00
2014-03-31T19:00:00
2014-03-31T20:00:00
2014-03-31T21:00:00
2014-03-31T22:00:00
2014-03-31T23:00:00
2014-04-01T00:00:00

サーバーの時刻の起点が 1970-01-01T00:00:00 ではないことがわかりました。TZ=UTC date --date="1970-01-01T00:00:00" +%sコマンドを入力-25200すると、7 時間のラグに対応する値が返されますが、0 になるはずです。私の質問は、この問題をサーバーでどのように修正できるかということです。この関数を実行しているマシンがわからないため、システム時刻が正しいかどうかをアプリオリに知っていると仮定して、この関数の同等のソリューションを見つけるのを手伝ってもらえますか?

4

1 に答える 1