]> granicus.if.org Git - php/commitdiff
Fixed bug #73837 ("new DateTime()" sometimes returns 1 second ago value).
authorDerick Rethans <github@derickrethans.nl>
Sat, 11 Feb 2017 11:10:01 +0000 (11:10 +0000)
committerDerick Rethans <github@derickrethans.nl>
Sat, 11 Feb 2017 11:10:01 +0000 (11:10 +0000)
NEWS
ext/date/php_date.c

diff --git a/NEWS b/NEWS
index 299f4e8de2647dd00f7261049da7ff09a5c03130..302da8d3a29ee78eee398860b6b163da92e6778c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,10 @@ PHP                                                                        NEWS
   . Fixed bug #61471 (Incomplete POST does not timeout but is passed to PHP).
     (Zheng Shao)
 
+- Date:
+  . Fixed bug #73837 ("new DateTime()" sometimes returns 1 second ago value).
+    (Derick)
+
 - GD:
   . Fixed bug #74031 (ReflectionFunction for imagepng is missing last two
     parameters). (finwe)
index fe1cbe2d41cb947c740e7bad514514bc7501c812..6bc180396812481828933eaae0b5a66fdff43bf4 100644 (file)
@@ -2549,15 +2549,17 @@ static void php_date_set_time_fraction(timelib_time *time, int microseconds)
        time->f = microseconds / 1000000;
 }
 
-static void php_date_set_current_time_fraction(timelib_time *time)
+static void php_date_get_current_time_with_fraction(time_t *sec, suseconds_t *usec)
 {
 #if HAVE_GETTIMEOFDAY
        struct timeval tp = {0}; /* For setting microseconds */
 
        gettimeofday(&tp, NULL);
-       timelib_set_fraction_from_timeval(time, tp);
+       *sec = tp.tv_sec;
+       *usec = tp.tv_usec;
 #else
-       time->f = 0;
+       *sec = time(NULL);
+       *usec = 0;
 #endif
 }
 
@@ -2569,6 +2571,8 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str,
        int type = TIMELIB_ZONETYPE_ID, new_dst = 0;
        char *new_abbr = NULL;
        timelib_sll new_offset = 0;
+       time_t sec;
+       suseconds_t usec;
 
        if (dateobj->time) {
                timelib_time_dtor(dateobj->time);
@@ -2633,8 +2637,9 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str,
                        now->tz_abbr = new_abbr;
                        break;
        }
-       timelib_unixtime2local(now, (timelib_sll) time(NULL));
-       php_date_set_current_time_fraction(now);
+       php_date_get_current_time_with_fraction(&sec, &usec);
+       timelib_unixtime2local(now, (timelib_sll) sec);
+       php_date_set_time_fraction(now, usec);
        timelib_fill_holes(dateobj->time, now, TIMELIB_NO_CLONE);
        timelib_update_ts(dateobj->time, tzi);
        timelib_update_from_sse(dateobj->time);