diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-03-30 05:15:10 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-03-30 05:15:10 +0000 |
commit | d66248a7cd7290366d0a6e88763f20901ec22796 (patch) | |
tree | 36eff24085b3667d55724785e82aa49142c34d0a | |
parent | 9c0d94449bd9f6304179ecdb9294b30cb6e51319 (diff) |
merge revision(s) 35002: [Backport #6135]
* ext/date/date_core.c (datetime_s_now): [ruby-core:43256].
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@35177 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | ext/date/date_core.c | 42 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 46 insertions, 2 deletions
@@ -1,3 +1,7 @@ +Fri Mar 30 14:14:36 2012 Tadayoshi Funaba <tadf@dotrb.org> + + * ext/date/date_core.c (datetime_s_now): [ruby-core:43256]. + Fri Mar 30 14:12:53 2012 Marc-Andre Lafortune <ruby-core@marc-andre.ca> * numeric.c: fix flodivmod for cornercases [Bug #6044] diff --git a/ext/date/date_core.c b/ext/date/date_core.c index 2c72143168..c22a9d496c 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -3584,6 +3584,15 @@ date_s_nth_kday(int argc, VALUE *argv, VALUE klass) #if !defined(HAVE_GMTIME_R) static struct tm* +gmtime_r(const time_t *t, struct tm *tm) +{ + auto struct tm *tmp = gmtime(t); + if (tmp) + *tm = *tmp; + return tmp; +} + +static struct tm* localtime_r(const time_t *t, struct tm *tm) { auto struct tm *tmp = localtime(t); @@ -3623,6 +3632,7 @@ date_s_today(int argc, VALUE *argv, VALUE klass) if (time(&t) == -1) rb_sys_fail("time"); + tzset(); if (!localtime_r(&t, &tm)) rb_sys_fail("localtime"); @@ -7838,6 +7848,7 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass) rb_sys_fail("gettimeofday"); sec = tv.tv_sec; #endif + tzset(); if (!localtime_r(&sec, &tm)) rb_sys_fail("localtime"); @@ -7851,8 +7862,37 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass) s = 59; #ifdef HAVE_STRUCT_TM_TM_GMTOFF of = tm.tm_gmtoff; +#elif defined(HAVE_VAR_TIMEZONE) +#ifdef HAVE_VAR_ALTZONE + of = (long)((tm.tm_isdst > 0) ? altzone : timezone); #else - of = -timezone; + of = (long)-timezone; + if (tm.tm_isdst) { + time_t sec2; + + tm.tm_isdst = 0; + sec2 = mktime(&tm); + of += (long)difftime(sec2, sec); + } +#endif +#elif defined(HAVE_TIMEGM) + { + time_t sec2; + + sec2 = timegm(&tm); + of = (long)difftime(sec2, sec); + } +#else + { + struct tm tm2; + time_t sec2; + + if (!gmtime_r(&sec, &tm2)) + rb_sys_fail("gmtime"); + tm2.tm_isdst = tm.tm_isdst; + sec2 = mktime(&tm2); + of = (long)difftime(sec, sec2); + } #endif #ifdef HAVE_CLOCK_GETTIME sf = ts.tv_nsec; @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 169 +#define RUBY_PATCHLEVEL 170 #define RUBY_RELEASE_DATE "2012-03-30" #define RUBY_RELEASE_YEAR 2012 |