summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-30 05:15:10 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-03-30 05:15:10 +0000
commitd66248a7cd7290366d0a6e88763f20901ec22796 (patch)
tree36eff24085b3667d55724785e82aa49142c34d0a /ext
parent9c0d94449bd9f6304179ecdb9294b30cb6e51319 (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
Diffstat (limited to 'ext')
-rw-r--r--ext/date/date_core.c42
1 files changed, 41 insertions, 1 deletions
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;