MDL-32234 Library: usergetdate return different values when timezone is set
authorRajesh Taneja <rajesh@moodle.com>
Thu, 29 Mar 2012 07:38:28 +0000 (15:38 +0800)
committerRajesh Taneja <rajesh@moodle.com>
Mon, 30 Apr 2012 02:59:01 +0000 (10:59 +0800)
usergetdate should return consistent values for different timezone. There are
two return path
1. If timezone is servertime, it returns getdate
2. If timezone other then servertime, it use gmstrftime, which returns string and
   values with leading zero.
In second case, leading zero's are removed and values are type casted. One major fix
is with yday, getdate returns 0 through 365, whereas %j returns 001 through 366. This
has been fixed as well.

lib/moodlelib.php
lib/tests/moodlelib_test.php

index 90c1677..a6a8217 100644 (file)
@@ -2086,6 +2086,15 @@ function usergetdate($time, $timezone=99) {
         $getdate['seconds']
     ) = explode('_', $datestring);
 
+    // set correct datatype to match with getdate()
+    $getdate['seconds'] = (int)$getdate['seconds'];
+    $getdate['yday'] = (int)$getdate['yday'] - 1; // gettime returns 0 through 365
+    $getdate['year'] = (int)$getdate['year'];
+    $getdate['mon'] = (int)$getdate['mon'];
+    $getdate['wday'] = (int)$getdate['wday'];
+    $getdate['mday'] = (int)$getdate['mday'];
+    $getdate['hours'] = (int)$getdate['hours'];
+    $getdate['minutes']  = (int)$getdate['minutes'];
     return $getdate;
 }
 
index e00c015..8552f6a 100644 (file)
@@ -1020,10 +1020,9 @@ class moodlelib_testcase extends advanced_testcase {
         $this->assertEquals($wday,3);
         $this->assertEquals($mon,12);
         $this->assertEquals($year,2009);
-        $this->assertEquals($yday,357);
+        $this->assertEquals($yday,356);
         $this->assertEquals($weekday, 'Wednesday');
         $this->assertEquals($month, 'December');
-
         $arr = usergetdate($ts);//gets the timezone from the $USER object
         $arr = array_values($arr);
 
@@ -1035,10 +1034,9 @@ class moodlelib_testcase extends advanced_testcase {
         $this->assertEquals($wday,3);
         $this->assertEquals($mon,12);
         $this->assertEquals($year,2009);
-        $this->assertEquals($yday,357);
+        $this->assertEquals($yday,356);
         $this->assertEquals($weekday, 'Wednesday');
         $this->assertEquals($month, 'December');
-
         //set the timezone back to what it was
         $USER->timezone = $userstimezone;