From: Tanaka Akira Date: 2004-03-30T19:48:10+09:00 Subject: [ruby-dev:23275] Re: Time.gm(...): gmtime/localtime error (ArgumentError) In article <4069466A.2030008@az.jp.nec.com>, MIYAMUKO Katsuyuki writes: > Time.gm でエラーになっているみたいです。 > > % ./miniruby -e "Time.gm(2000,1,1,1,1,1)" > -e:1:in `gm': gmtime/localtime error (ArgumentError) > from -e:1 > (gdb) print guess_lo > $2 = -9223372036854775808 うぅむ。ついにこの不具合が報告される日が。 64bit time_t で timegm の無い環境が手元に無いのでちゃんとテストして直 したわけではないのですが、次のパッチを当てるとどうでしょうか。 Index: time.c =================================================================== RCS file: /src/ruby/time.c,v retrieving revision 1.96 diff -u -r1.96 time.c --- time.c 29 Mar 2004 07:54:15 -0000 1.96 +++ time.c 30 Mar 2004 10:42:11 -0000 @@ -444,6 +444,15 @@ (1UL << (8 * sizeof(time_t) - 1)) - 1 : ~(time_t)0; +#if defined(HAVE_MKTIME) + if ((guess = mktime(tptr)) != -1) { + if (guess_lo < guess - 24 * 60 * 60) + guess_lo = guess - 24 * 60 * 60; + if (guess + 24 * 60 * 60 < guess_hi) + guess_hi = guess + 24 * 60 * 60; + } +#endif + tm = (utc_p ? gmtime : localtime)(&guess_lo); if (!tm) goto error; d = tmcmp(tptr, tm); 本当は、これに加えてさらに mktime も無い場合と mktime が -1 を返した場 合にそなえて、閏秒を考慮しない timegm を自前で書いてあげないといけない のですが。 -- [田中 哲][たなか あきら][Tanaka Akira]