> > 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

Reply via email to