From: Tanaka Akira Date: 2001-12-14T03:47:54+09:00 Subject: [ruby-dev:15435] Time#utcoff In article , Tanaka Akira writes: > > $B$*$*$C!"BT$C$F$k$H%Q%C%A$,Mh$k$N$+$7$i!#$o$/$o$/!#(B > > $B$=$l$OB.EY0J30$G$O30It$+$i4QB,ITG=$J$N$G!"M%@hEY$OHs>o$KDc$$$G$9!#(B $B$"$l$O(B Linux/Alpha $B$G<:GT$9$k$3$H$,H=L@$7$?$N$GM%@hEY$,>e$,$j$^$7$?(B... $B$,!"$=$l$O$=$l$H$7$F(B > 1. Time#utcoff $B$N]) $B$G:Q$`$s$G$9$,!#(B ($B$H$$$$$D$D(B 2.13 $B$G$O;n$7$F$J$$$N$G$&$^$/F0$+$J$$$+$b!#(B) Index: configure.in =================================================================== RCS file: /src/ruby/configure.in,v retrieving revision 1.103 diff -u -r1.103 configure.in --- configure.in 2001/12/03 09:38:35 1.103 +++ configure.in 2001/12/13 18:31:03 @@ -302,6 +302,14 @@ getpgrp setpgrp getpgid setpgid getgroups getpriority getrlimit\ dlopen sigprocmask sigaction _setjmp setsid telldir seekdir fchmod) AC_STRUCT_TIMEZONE +AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff, + [AC_TRY_COMPILE([#include ], + [struct tm t; t.tm_gmtoff = 3600;], + [rb_cv_member_struct_tm_tm_gmtoff=yes], + [rb_cv_member_struct_tm_tm_gmtoff=no])]) +if test "$rb_cv_member_struct_tm_tm_gmtoff" = yes; then + AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF) +fi AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight, [AC_TRY_LINK([#include int i;], Index: time.c =================================================================== RCS file: /src/ruby/time.c,v retrieving revision 1.47 diff -u -r1.47 time.c --- time.c 2001/12/13 08:19:07 1.47 +++ time.c 2001/12/13 18:31:07 @@ -1071,6 +1071,48 @@ } static VALUE +time_utcoff(time) + VALUE time; +{ + struct time_object *tobj; + + GetTimeval(time, tobj); + if (tobj->tm_got == 0) { + time_get_tm(time, tobj->gmt); + } + + if (tobj->gmt == 1) { + return INT2FIX(0); + } + else { +#if defined(HAVE_STRUCT_TM_TM_GMTOFF) + return INT2NUM(tobj->tm.tm_gmtoff); +#else + struct tm *u, *l; + time_t t; + int off; + l = &tobj->tm; + t = tobj->tv.tv_sec; + u = gmtime(&t); + if (!u) + rb_raise(rb_eArgError, "gmtime error"); + if (l->tm_year != u->tm_year) + off = l->tm_year < u->tm_year ? -1 : 1; + else if (l->tm_mon != u->tm_mon) + off = l->tm_mon < u->tm_mon ? -1 : 1; + else if (l->tm_mday != u->tm_mday) + off = l->tm_mday < u->tm_mday ? -1 : 1; + else + off = 0; + off = off * 24 + l->tm_hour - u->tm_hour; + off = off * 60 + l->tm_min - u->tm_min; + off = off * 60 + l->tm_sec - u->tm_sec; + return INT2FIX(off); +#endif + } +} + +static VALUE time_to_a(time) VALUE time; { @@ -1315,6 +1357,8 @@ rb_define_method(rb_cTime, "isdst", time_isdst, 0); rb_define_method(rb_cTime, "dst?", time_isdst, 0); rb_define_method(rb_cTime, "zone", time_zone, 0); + rb_define_method(rb_cTime, "utcoff", time_utcoff, 0); + rb_define_method(rb_cTime, "gmtoff", time_utcoff, 0); rb_define_method(rb_cTime, "utc?", time_utc_p, 0); rb_define_method(rb_cTime, "gmt?", time_utc_p, 0); -- [$BEDCf(B $BE/(B][$B$?$J$+(B $B$"$-$i(B][Tanaka Akira] $B!V$U$($m(B! $B$o$+$a$A$c$s:n@o$G$9$(C"=$B!W(B(Little Worker, $B7KM7@84](B)