[前][次][番号順一覧][スレッド一覧]

ruby-changes:16270

From: akr <ko1@a...>
Date: Wed, 9 Jun 2010 22:54:17 +0900 (JST)
Subject: [ruby-changes:16270] Ruby:r28238 (trunk): * time.c (find_time_t): always outerpolate from past.

akr	2010-06-09 22:54:03 +0900 (Wed, 09 Jun 2010)

  New Revision: 28238

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28238

  Log:
    * time.c (find_time_t): always outerpolate from past.
      [ruby-core:30672] reported by Benoit Daloze.

  Modified files:
    trunk/ChangeLog
    trunk/time.c

Index: time.c
===================================================================
--- time.c	(revision 28237)
+++ time.c	(revision 28238)
@@ -2674,6 +2674,7 @@
     int find_dst;
     struct tm result;
     int status;
+    int tptr_tm_yday;
 
 #define GUESS(p) (DEBUG_FIND_TIME_NUMGUESS_INC (utc_p ? gmtime_with_leapsecond(p, &result) : LOCALTIME(p, result)))
 
@@ -2901,23 +2902,31 @@
 	}
     }
     /* Given argument has no corresponding time_t. Let's outerpolation. */
-    if (tm_lo.tm_year == tptr->tm_year && tm_lo.tm_mon == tptr->tm_mon) {
-	*tp = guess_lo +
-	      (tptr->tm_mday - tm_lo.tm_mday) * 24 * 60 * 60 +
-	      (tptr->tm_hour - tm_lo.tm_hour) * 60 * 60 +
-	      (tptr->tm_min - tm_lo.tm_min) * 60 +
-	      (tptr->tm_sec - tm_lo.tm_sec);
-        return NULL;
-    }
-    else if (tm_hi.tm_year == tptr->tm_year && tm_hi.tm_mon == tptr->tm_mon) {
-	*tp = guess_hi +
-	      (tptr->tm_mday - tm_hi.tm_mday) * 24 * 60 * 60 +
-	      (tptr->tm_hour - tm_hi.tm_hour) * 60 * 60 +
-	      (tptr->tm_min - tm_hi.tm_min) * 60 +
-	      (tptr->tm_sec - tm_hi.tm_sec);
-        return NULL;
-    }
+    /*
+     *  `Seconds Since the Epoch' in SUSv3:
+     *  tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
+     *  (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
+     *  ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
+     */
 
+    tptr_tm_yday = calc_tm_yday(tptr->tm_year, tptr->tm_mon, tptr->tm_mday);
+
+    *tp = guess_lo +
+          ((tptr->tm_year - tm_lo.tm_year) * 365 +
+           ((tptr->tm_year-69)/4) -
+           ((tptr->tm_year-1)/100) +
+           ((tptr->tm_year+299)/400) -
+           ((tm_lo.tm_year-69)/4) +
+           ((tm_lo.tm_year-1)/100) -
+           ((tm_lo.tm_year+299)/400) +
+           tptr_tm_yday -
+           tm_lo.tm_yday) * 86400 +
+          (tptr->tm_hour - tm_lo.tm_hour) * 3600 +
+          (tptr->tm_min - tm_lo.tm_min) * 60 +
+          (tptr->tm_sec - tm_lo.tm_sec);
+
+    return NULL;
+
   out_of_range:
     return "time out of range";
 
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28237)
+++ ChangeLog	(revision 28238)
@@ -1,3 +1,8 @@
+Wed Jun  9 22:51:50 2010  Tanaka Akira  <akr@f...>
+
+	* time.c (find_time_t): always outerpolate from past.
+	  [ruby-core:30672] reported by Benoit Daloze.
+
 Wed Jun  9 22:13:08 2010  Tanaka Akira  <akr@f...>
 
 	* time.c (calc_tm_yday): extracted from timegmw_noleapsecond.

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]