ふなばです。

>待てよ,修正する前にこれは移植性のある動作かどうか確認せねば.

ちょっと考えてみました。 
たぶん、あつかえるかどうかは、localtime()、gmtime() のつくりによる、と
いうことになるんじゃないでしょうか。

time_t をつくるのは time() や mktime() で (システムによっては他にもあ
るでしょう)、time() はエラーのとき、-1 を返します。もちろん、エポック
は絶対に過去なので、これは関係ないともいえます。 ANSI にある mktime()
もエラーのとき、-1 を返します。ただし、Ruby は mktime() をつかっていな
いので、これも関係ないともいえるかもしれません。

しかし、ANSI の mktime() の仕様を尊重すれば、time_t で負の経過秒は表現
しないものだと解釈できそうです。 だとすると、Ruby でも禁止にしておくの
が筋かしら。

システムによっては、Ruby の at を直しさえすれば、そのまま、あるいはちょっ
との修正で負の経過秒はつかえる可能性もありそうです。

でも、一見それらしくみえても、それは正しくないかもしれないので、注意が
必要です。localtime()、gmtime() のつくりによるとすれば、UNIX では
zoneinfo のことを考えなければなりません。zoneinfo から 1970 年以前の情
報が得られないと間違えることがあると思います。日本でも夏時間が実施され
たことがありますが、実際的には、そういう情報は載ってないと思われます
(UTC に限っていえば、とくに影響はなさそうですが)。

ということで、大雑把ですが、ここまで考えたところで、現実的には難しいも
のがあると感じています。

# やはり、mktime が負の経過秒をつくらないようにすべきでしょうか。

--Tadayoshi Funaba