> > echo mktime(2,0,0,4,-6,2004); /* or 0 to -5 */ > > This returns 1080176400 (2004-03-25 02:00:00) here (PHP 4.3.6) which > looks ok to me. > > What are the values on your system?
ok I have some problems with test values here now, but I can provide the original phpgw code that is affected and the values from it: $sday = mktime(2,0,0,$month,$day - ($weekday - 1),$year); echo ':' . $day . ':' . $weekday . "<br />\n"; echo ':' . $year . '/' . $month . '/' . ($day - ($weekday - 1)) . ' : ' . $sday . ":<br /><hr />\n"; Output values here 32bit linux machine: :1:4 :2004/4/-2 : 1080518400: :1:2 :2004/6/0 : 1085961600: :1:6 :2004/05/-4 : 1082937600: :1:6 :2004/05/-4 : 1082937600: output values 64 bit itanium2: :1:4 :2004/4/-2 : 1080694800: :1:2 :2004/6/0 : 1085965200: :1:6 :2004/05/-4 : 1083286800: :1:6 :2004/05/-4 : 1083286800: The complete function within this code was found is: function get_weekday_start($year,$month,$day) { $weekday = $this->day_of_week($year,$month,$day); switch($GLOBALS['phpgw_info']['user']['preferences']['calendar']['weekdaysta rts']) { // Saturday is for arabic support case 'Saturday': $this->days = Array( 0 => 'Sat', 1 => 'Sun', 2 => 'Mon', 3 => 'Tue', 4 => 'Wed', 5 => 'Thu', 6 => 'Fri' ); switch($weekday) { case 0: $sday = mktime(2,0,0,$month,$day - 1,$year); break; case 6: $sday = mktime(2,0,0,$month,$day,$year); break; default: $sday = mktime(2,0,0,$month,$day - ($weekday + 1),$year); break; } break; case 'Monday': $this->days = Array( 0 => 'Mon', 1 => 'Tue', 2 => 'Wed', 3 => 'Thu', 4 => 'Fri', 5 => 'Sat', 6 => 'Sun' ); switch($weekday) { case 0: $sday = mktime(2,0,0,$month,$day - 6,$year); break; case 1: $sday = mktime(2,0,0,$month,$day,$year); break; default: $sday = mktime(2,0,0,$month,$day - ($weekday - 1),$year); echo ':' . $day . ':' . $weekday . "<br />\n"; echo ':' . $year . '/' . $month . '/' . ($day - ($weekday - 1)) . ' : ' . $sday . ":<br /><hr />\n"; break; } break; case 'Sunday': default: $this->days = Array( 0 => 'Sun', 1 => 'Mon', 2 => 'Tue', 3 => 'Wed', 4 => 'Thu', 5 => 'Fri', 6 => 'Sat' ); $sday = mktime(2,0,0,$month,$day - $weekday,$year); break; } return $sday - 7200; } after I changed this code by the following patch, it works as expected on both platforms: Index: class.datetime.inc.php =================================================================== RCS file: /cvsroot/phpgwapi/phpgwapi/inc/class.datetime.inc.php,v retrieving revision 1.5.2.12.2.8 diff -u -r1.5.2.12.2.8 class.datetime.inc.php --- class.datetime.inc.php 1 May 2004 09:32:26 -0000 1.5.2.12.2.8 +++ class.datetime.inc.php 5 May 2004 11:41:19 -0000 @@ -216,15 +216,45 @@ ); switch($weekday) { - case 0: - $sday = mktime(2,0,0,$month,$day - 1,$year); - break; case 6: - $sday = mktime(2,0,0,$month,$day,$year); break; - default: - $sday = mktime(2,0,0,$month,$day - ($weekday + 1),$year); + case 0: + if ($day == 1) + { + if ($month == 1) + { + --$year; + $month = 12; + } + else + { + --$month; + } + $day = $this->days_in_month($month,$year); + } + else + { + --$day; + } break; + default: + if ($day <= ($weekday + 1)) + { + if ($month == 1) + { + --$year; + $month = 12; + } + else + { + --$month; + } + $day = $this->days_in_month($month,$year) - $weekday; + } + else + { + $day -= ($weekday + 1); + } } break; case 'Monday': @@ -239,15 +269,45 @@ ); switch($weekday) { - case 0: - $sday = mktime(2,0,0,$month,$day - 6,$year); - break; case 1: - $sday = mktime(2,0,0,$month,$day,$year); break; - default: - $sday = mktime(2,0,0,$month,$day - ($weekday - 1),$year); + case 0: + if ($day <= 6) + { + if ($month == 1) + { + --$year; + $month = 12; + } + else + { + --$month; + } + $day = $this->days_in_month($month,$year) + ($day - 6); + } + else + { + $day -= 6; + } break; + default: + if ($day <= ($weekday == 0) ? 6 : ($weekday-1)) + { + if ($month == 1) + { + --$year; + $month = 12; + } + else + { + --$month; + } + $day = $this->days_in_month($month,$year) + ($day - (($weekday == 0) ? 6 : ($weekday-1))); + } + else + { + $day -= ($weekday-1); + } } break; case 'Sunday': @@ -261,9 +321,25 @@ 5 => 'Fri', 6 => 'Sat' ); - $sday = mktime(2,0,0,$month,$day - $weekday,$year); - break; + if ($day <= $weekday) + { + if ($month == 1) + { + --$year; + $month = 12; + } + else + { + --$month; + } + $day = $this->days_in_month($month,$year) + ($day - $weekday); + } + else + { + $day -= $weekday; + } } + $sday = mktime(2,0,0,$month,$day,$year); return $sday - 7200; } any ideas? Greetings and Thanks Kai Hofmann -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php