summaryrefslogtreecommitdiff
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
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
-rw-r--r--ChangeLog4
-rw-r--r--ext/date/date_core.c42
-rw-r--r--version.h2
3 files changed, 46 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 63ff30bcd3..318996b304 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
diff --git a/version.h b/version.h
index de2b91efd3..81d4a88046 100644
--- a/version.h
+++ b/version.h
@@ -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