2001-05-20 03:20:20 +02:00
< ? php
2003-12-17 00:14:15 +01:00
/************************************************************************** \
2004-05-05 14:06:13 +02:00
* eGroupWare API - Commononly used functions *
2003-12-17 00:14:15 +01:00
* This file written by Dan Kuykendall < seek3r @ phpgroupware . org > *
* and Joseph Engo < jengo @ phpgroupware . org > *
* and Mark Peters < skeeter @ phpgroupware . org > *
* Commononly used functions by phpGroupWare developers *
* Copyright ( C ) 2000 , 2001 Dan Kuykendall *
* -------------------------------------------------------------------------*
* This library is part of the eGroupWare API *
* http :// www . egroupware . org *
* ------------------------------------------------------------------------ *
* This library is free software ; you can redistribute it and / or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation ; either version 2.1 of the License , *
* or any later version . *
* This library is distributed in the hope that it will be useful , but *
* WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . *
* See the GNU Lesser General Public License for more details . *
* You should have received a copy of the GNU Lesser General Public License *
* along with this library ; if not , write to the Free Software Foundation , *
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA *
\ **************************************************************************/
2001-05-20 03:20:20 +02:00
/* $Id$ */
2001-06-17 18:55:04 +02:00
$d1 = strtolower ( @ substr ( PHPGW_API_INC , 0 , 3 ));
$d2 = strtolower ( @ substr ( PHPGW_SERVER_ROOT , 0 , 3 ));
$d3 = strtolower ( @ substr ( PHPGW_APP_INC , 0 , 3 ));
2001-05-20 03:20:20 +02:00
if ( $d1 == 'htt' || $d1 == 'ftp' || $d2 == 'htt' || $d2 == 'ftp' || $d3 == 'htt' || $d3 == 'ftp' )
{
echo 'Failed attempt to break in via an old Security Hole!<br>' . " \n " ;
exit ;
}
unset ( $d1 );
unset ( $d2 );
unset ( $d3 );
2001-09-23 21:38:24 +02:00
/*!
@ class datetime
@ abstract datetime class that contains common date / time functions
*/
class datetime
2001-05-20 03:20:20 +02:00
{
2001-09-23 21:38:24 +02:00
var $tz_offset ;
var $days = Array ();
2003-12-17 00:14:15 +01:00
var $days_short = Array ();
2002-06-23 20:05:15 +02:00
var $gmtnow = 0 ;
var $users_localtime ;
2003-08-28 16:31:11 +02:00
var $cv_gmtdate ;
2001-05-20 03:20:20 +02:00
2001-09-23 21:38:24 +02:00
function datetime ()
2001-05-20 03:20:20 +02:00
{
2003-12-13 16:03:23 +01:00
$this -> tz_offset = 3600 * ( int ) @ $GLOBALS [ 'phpgw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'tz_offset' ];
2002-09-21 23:54:20 +02:00
print_debug ( 'datetime::datetime::gmtnow' , $this -> gmtnow , 'api' );
2002-06-23 20:05:15 +02:00
$error_occured = True ;
// If we already have a GMT time, no need to do this again.
2002-08-14 01:39:39 +02:00
if ( ! $this -> gmtnow )
2002-06-23 20:05:15 +02:00
{
2002-08-14 01:39:39 +02:00
if ( isset ( $GLOBALS [ 'phpgw_info' ][ 'server' ][ 'tz_offset' ]))
2002-06-23 20:05:15 +02:00
{
2003-12-13 16:03:23 +01:00
$this -> gmtnow = time () - (( int ) $GLOBALS [ 'phpgw_info' ][ 'server' ][ 'tz_offset' ] * 3600 );
2004-01-22 21:52:14 +01:00
print_debug ( 'datetime::datetime::tz_offset' , " set via tz_offset= " . $GLOBALS [ 'phpgw_info' ][ 'server' ][ 'tz_offset' ] . " : gmtnow= " . date ( 'Y/m/d H:i' , $this -> gmtnow ), 'api' );
2002-06-23 20:05:15 +02:00
}
2002-08-14 01:39:39 +02:00
else
2002-06-23 20:05:15 +02:00
{
2002-09-02 04:39:36 +02:00
$this -> gmtnow = time () - ( $this -> getbestguess () * 3600 );
2004-01-22 21:52:14 +01:00
print_debug ( 'datetime::datetime::bestguess' , " set via bestguess= " . $this -> getbestguess () . " : gmtnow= " . date ( 'Y/m/d H:i' , $this -> gmtnow ), 'api' );
2002-06-23 20:05:15 +02:00
}
}
2003-05-17 23:25:09 +02:00
$this -> users_localtime = time () + $this -> tz_offset ;
2002-08-14 01:39:39 +02:00
}
2003-12-13 16:03:23 +01:00
2002-08-14 01:39:39 +02:00
function getntpoffset ()
{
$error_occured = False ;
if ( !@ is_object ( $GLOBALS [ 'phpgw' ] -> network ))
{
$GLOBALS [ 'phpgw' ] -> network = createobject ( 'phpgwapi.network' );
}
$server_time = time ();
if ( $GLOBALS [ 'phpgw' ] -> network -> open_port ( '129.6.15.28' , 13 , 5 ))
2002-06-23 20:05:15 +02:00
{
2002-08-14 01:39:39 +02:00
$line = $GLOBALS [ 'phpgw' ] -> network -> bs_read_port ( 64 );
$GLOBALS [ 'phpgw' ] -> network -> close_port ();
$array = explode ( ' ' , $line );
// host: 129.6.15.28
// Value returned is 52384 02-04-20 13:55:29 50 0 0 9.2 UTC(NIST) *
2002-09-21 23:54:20 +02:00
print_debug ( 'Server datetime' , time (), 'api' );
print_debug ( 'Temporary NTP datetime' , $line , 'api' );
2002-08-14 01:39:39 +02:00
if ( $array [ 5 ] == 4 )
{
$error_occured = True ;
}
else
{
$date = explode ( '-' , $array [ 1 ]);
$time = explode ( ':' , $array [ 2 ]);
2003-12-13 16:03:23 +01:00
$this -> gmtnow = mktime (( int ) $time [ 0 ],( int ) $time [ 1 ],( int ) $time [ 2 ],( int ) $date [ 1 ],( int ) $date [ 2 ],( int ) $date [ 0 ] + 2000 );
2002-09-21 23:54:20 +02:00
print_debug ( 'Temporary RFC epoch' , $this -> gmtnow , 'api' );
print_debug ( 'GMT' , date ( 'Ymd H:i:s' , $this -> gmtnow ), 'api' );
2002-08-14 01:39:39 +02:00
}
2002-06-23 20:05:15 +02:00
}
else
{
$error_occured = True ;
}
2003-12-13 16:03:23 +01:00
2002-08-14 01:39:39 +02:00
if ( $error_occured == True )
{
return $this -> getbestguess ();
}
else
{
2004-01-15 09:55:48 +01:00
return ( int )(( $server_time - $this -> gmtnow ) / 3600 );
2002-08-14 01:39:39 +02:00
}
}
2002-06-23 20:05:15 +02:00
2002-08-14 01:39:39 +02:00
function gethttpoffset ()
{
$error_occured = False ;
if ( !@ is_object ( $GLOBALS [ 'phpgw' ] -> network ))
2002-04-16 17:45:50 +02:00
{
2002-08-14 01:39:39 +02:00
$GLOBALS [ 'phpgw' ] -> network = createobject ( 'phpgwapi.network' );
2002-04-16 17:45:50 +02:00
}
2002-08-14 01:39:39 +02:00
$server_time = time ();
2002-06-23 20:05:15 +02:00
2002-08-14 01:39:39 +02:00
$filename = 'http://132.163.4.213/timezone.cgi?GMT' ;
$file = $GLOBALS [ 'phpgw' ] -> network -> gethttpsocketfile ( $filename );
if ( ! $file )
2002-06-23 20:05:15 +02:00
{
2002-08-14 01:39:39 +02:00
return $this -> getbestguess ();
2002-06-23 20:05:15 +02:00
}
2002-08-14 01:39:39 +02:00
$time = strip_tags ( $file [ 55 ]);
$date = strip_tags ( $file [ 56 ]);
2002-09-21 23:54:20 +02:00
print_debug ( 'GMT DateTime' , $date . ' ' . $time , 'api' );
2002-08-14 01:39:39 +02:00
$dt_array = explode ( ' ' , $date );
$temp_datetime = $dt_array [ 0 ] . ' ' . substr ( $dt_array [ 2 ], 0 , - 1 ) . ' ' . substr ( $dt_array [ 1 ], 0 , 3 ) . ' ' . $dt_array [ 3 ] . ' ' . $time . ' GMT' ;
2002-09-21 23:54:20 +02:00
print_debug ( 'Reformulated GMT DateTime' , $temp_datetime , 'api' );
2002-08-14 01:39:39 +02:00
$this -> gmtnow = $this -> convert_rfc_to_epoch ( $temp_datetime );
2002-09-21 23:54:20 +02:00
print_debug ( 'this->gmtnow' , $this -> gmtnow , 'api' );
print_debug ( 'server time' , $server_time , 'api' );
print_debug ( 'server DateTime' , date ( 'D, d M Y H:i:s' , $server_time ), 'api' );
2004-01-15 02:25:29 +01:00
return ( int )(( $server_time - $this -> gmtnow ) / 3600 );
2002-08-14 01:39:39 +02:00
}
function getbestguess ()
{
2002-09-21 23:54:20 +02:00
print_debug ( 'datetime::datetime::debug: Inside getting from local server' , 'api' );
2002-08-14 01:39:39 +02:00
$server_time = time ();
// Calculate GMT time...
// If DST, add 1 hour...
// - (date('I') == 1?3600:0)
$this -> gmtnow = $this -> convert_rfc_to_epoch ( gmdate ( 'D, d M Y H:i:s' , $server_time ) . ' GMT' );
2004-01-15 02:25:29 +01:00
return ( int )(( $server_time - $this -> gmtnow ) / 3600 );
2002-04-16 17:45:50 +02:00
}
function convert_rfc_to_epoch ( $date_str )
{
$comma_pos = strpos ( $date_str , ',' );
if ( $comma_pos )
{
$date_str = substr ( $date_str , $comma_pos + 1 );
}
// This may need to be a reference to the different months in native tongue....
$month = array (
'Jan' => 1 ,
'Feb' => 2 ,
'Mar' => 3 ,
'Apr' => 4 ,
'May' => 5 ,
'Jun' => 6 ,
'Jul' => 7 ,
'Aug' => 8 ,
'Sep' => 9 ,
'Oct' => 10 ,
'Nov' => 11 ,
'Dec' => 12
);
$dta = array ();
$ta = array ();
// Convert "15 Jul 2000 20:50:22 +0200" to unixtime
$dta = explode ( ' ' , $date_str );
$ta = explode ( ':' , $dta [ 4 ]);
if ( substr ( $dta [ 5 ], 0 , 3 ) <> 'GMT' )
{
$tzoffset = substr ( $dta [ 5 ], 0 , 1 );
2003-12-13 16:03:23 +01:00
$tzhours = ( int ) substr ( $dta [ 5 ], 1 , 2 );
$tzmins = ( int ) substr ( $dta [ 5 ], 3 , 2 );
2002-04-16 17:45:50 +02:00
switch ( $tzoffset )
{
case '-' :
( int ) $ta [ 0 ] += $tzhours ;
( int ) $ta [ 1 ] += $tzmins ;
break ;
case '+' :
( int ) $ta [ 0 ] -= $tzhours ;
( int ) $ta [ 1 ] -= $tzmins ;
break ;
}
}
return mktime ( $ta [ 0 ], $ta [ 1 ], $ta [ 2 ], $month [ $dta [ 2 ]], $dta [ 1 ], $dta [ 3 ]);
2001-05-20 03:20:20 +02:00
}
2002-04-16 17:45:50 +02:00
2001-09-23 21:38:24 +02:00
function get_weekday_start ( $year , $month , $day )
2001-05-20 03:20:20 +02:00
{
2001-09-23 21:38:24 +02:00
$weekday = $this -> day_of_week ( $year , $month , $day );
switch ( $GLOBALS [ 'phpgw_info' ][ 'user' ][ 'preferences' ][ 'calendar' ][ 'weekdaystarts' ])
{
// Saturday is for arabic support
case 'Saturday' :
$this -> days = Array (
2003-08-28 16:31:11 +02:00
0 => 'Sat' ,
1 => 'Sun' ,
2 => 'Mon' ,
3 => 'Tue' ,
4 => 'Wed' ,
5 => 'Thu' ,
6 => 'Fri'
2001-09-23 21:38:24 +02:00
);
2003-12-17 00:14:15 +01:00
$this -> days_short = Array (
0 => 'Sa' ,
1 => 'Su' ,
2 => 'Mo' ,
3 => 'Tu' ,
4 => 'We' ,
5 => 'Th' ,
6 => 'Fr'
);
2001-09-23 21:38:24 +02:00
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 (
2003-08-28 16:31:11 +02:00
0 => 'Mon' ,
1 => 'Tue' ,
2 => 'Wed' ,
3 => 'Thu' ,
4 => 'Fri' ,
5 => 'Sat' ,
6 => 'Sun'
2001-09-23 21:38:24 +02:00
);
2003-12-17 00:14:15 +01:00
$this -> days_short = Array (
0 => 'Mo' ,
1 => 'Tu' ,
2 => 'We' ,
3 => 'Th' ,
4 => 'Fr' ,
5 => 'Sa' ,
6 => 'Su'
);
2001-09-23 21:38:24 +02:00
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 );
break ;
}
break ;
2001-09-28 04:18:55 +02:00
case 'Sunday' :
default :
$this -> days = Array (
2003-08-28 16:31:11 +02:00
0 => 'Sun' ,
1 => 'Mon' ,
2 => 'Tue' ,
3 => 'Wed' ,
4 => 'Thu' ,
5 => 'Fri' ,
6 => 'Sat'
2001-09-28 04:18:55 +02:00
);
2003-12-17 00:14:15 +01:00
$this -> days_short = Array (
0 => 'Su' ,
1 => 'Mo' ,
2 => 'Tu' ,
3 => 'We' ,
4 => 'Th' ,
5 => 'Fr' ,
6 => 'Sa'
);
2002-04-16 17:45:50 +02:00
$sday = mktime ( 2 , 0 , 0 , $month , $day - $weekday , $year );
2001-09-28 04:18:55 +02:00
break ;
2001-09-23 21:38:24 +02:00
}
2002-04-16 17:45:50 +02:00
return $sday - 7200 ;
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function is_leap_year ( $year )
2001-05-20 03:20:20 +02:00
{
2003-12-13 16:03:23 +01:00
if ((( int ) $year % 4 == 0 ) && (( int ) $year % 100 != 0 ) || (( int ) $year % 400 == 0 ))
2001-09-23 21:38:24 +02:00
{
return 1 ;
}
else
{
return 0 ;
}
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function days_in_month ( $month , $year )
2001-05-20 03:20:20 +02:00
{
2001-09-23 21:38:24 +02:00
$days = Array (
2003-12-13 16:03:23 +01:00
1 => 31 ,
2 => 28 + $this -> is_leap_year (( int ) $year ),
3 => 31 ,
4 => 30 ,
5 => 31 ,
6 => 30 ,
7 => 31 ,
8 => 31 ,
9 => 30 ,
10 => 31 ,
11 => 30 ,
12 => 31
2001-09-23 21:38:24 +02:00
);
2003-12-13 16:03:23 +01:00
return $days [( int ) $month ];
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function date_valid ( $year , $month , $day )
2001-05-20 03:20:20 +02:00
{
2003-12-13 16:03:23 +01:00
return checkdate (( int ) $month ,( int ) $day ,( int ) $year );
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function time_valid ( $hour , $minutes , $seconds )
2001-05-20 03:20:20 +02:00
{
2003-12-13 16:03:23 +01:00
if (( int ) $hour < 0 || ( int ) $hour > 24 )
2001-09-23 21:38:24 +02:00
{
return False ;
}
2003-12-13 16:03:23 +01:00
if (( int ) $minutes < 0 || ( int ) $minutes > 59 )
2001-09-23 21:38:24 +02:00
{
return False ;
}
2003-12-13 16:03:23 +01:00
if (( int ) $seconds < 0 || ( int ) $seconds > 59 )
2001-09-23 21:38:24 +02:00
{
return False ;
}
return True ;
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function day_of_week ( $year , $month , $day )
2001-05-20 03:20:20 +02:00
{
2001-09-23 21:38:24 +02:00
if ( $month > 2 )
{
$month -= 2 ;
}
else
{
$month += 10 ;
$year -- ;
}
$day = ( floor (( 13 * $month - 1 ) / 5 ) + $day + ( $year % 100 ) + floor (( $year % 100 ) / 4 ) + floor (( $year / 100 ) / 4 ) - 2 * floor ( $year / 100 ) + 77 );
return (( $day - 7 * floor ( $day / 7 )));
2001-05-20 03:20:20 +02:00
}
2003-12-13 16:03:23 +01:00
2001-09-23 21:38:24 +02:00
function day_of_year ( $year , $month , $day )
2001-05-20 03:20:20 +02:00
{
2001-09-23 21:38:24 +02:00
$days = array ( 0 , 31 , 59 , 90 , 120 , 151 , 181 , 212 , 243 , 273 , 304 , 334 );
$julian = ( $days [ $month - 1 ] + $day );
if ( $month > 2 && $this -> is_leap_year ( $year ))
{
$julian ++ ;
}
return ( $julian );
2001-05-20 03:20:20 +02:00
}
2002-09-17 12:03:37 +02:00
/*!
@ function days_between
@ abstract Get the number of days between two dates
2003-02-26 17:44:11 +01:00
@ author Steven Cramer / Ralf Becker
2002-09-17 12:03:37 +02:00
@ param $m1 - Month_1 , $d1 - Day_1 , $y1 - Year_1 , $m2 - Month_2 , $d2 - Day_2 , $y2 - Year_2
2003-03-18 19:02:36 +01:00
@ note the last param == 0 , ensures that the calculation is always done without daylight - saveing
2002-09-17 12:03:37 +02:00
*/
function days_between ( $m1 , $d1 , $y1 , $m2 , $d2 , $y2 )
{
2003-12-26 21:58:43 +01:00
return ( int )(( mktime ( 0 , 0 , 0 , $m2 , $d2 , $y2 , 0 ) - mktime ( 0 , 0 , 0 , $m1 , $d1 , $y1 , 0 )) / 86400 );
2002-09-17 12:03:37 +02:00
}
2001-09-23 21:38:24 +02:00
function date_compare ( $a_year , $a_month , $a_day , $b_year , $b_month , $b_day )
2001-05-20 03:20:20 +02:00
{
2003-12-13 16:03:23 +01:00
$a_date = mktime ( 0 , 0 , 0 ,( int ) $a_month ,( int ) $a_day ,( int ) $a_year );
$b_date = mktime ( 0 , 0 , 0 ,( int ) $b_month ,( int ) $b_day ,( int ) $b_year );
2001-09-23 21:38:24 +02:00
if ( $a_date == $b_date )
{
return 0 ;
}
elseif ( $a_date > $b_date )
{
return 1 ;
}
elseif ( $a_date < $b_date )
{
return - 1 ;
}
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function time_compare ( $a_hour , $a_minute , $a_second , $b_hour , $b_minute , $b_second )
2001-05-20 03:20:20 +02:00
{
2003-04-18 10:37:04 +02:00
// I use the 1970/1/2 to compare the times, as the 1. can get via TZ-offest still
// before 1970/1/1, which is the earliest date allowed on windows
2003-12-13 16:03:23 +01:00
$a_time = mktime (( int ) $a_hour ,( int ) $a_minute ,( int ) $a_second , 1 , 2 , 1970 );
$b_time = mktime (( int ) $b_hour ,( int ) $b_minute ,( int ) $b_second , 1 , 2 , 1970 );
2001-09-23 21:38:24 +02:00
if ( $a_time == $b_time )
{
return 0 ;
}
elseif ( $a_time > $b_time )
{
return 1 ;
}
elseif ( $a_time < $b_time )
{
return - 1 ;
}
2001-05-20 03:20:20 +02:00
}
2001-09-23 21:38:24 +02:00
function makegmttime ( $hour , $minute , $second , $month , $day , $year )
2001-05-20 03:20:20 +02:00
{
2001-09-23 21:38:24 +02:00
return $this -> gmtdate ( mktime ( $hour , $minute , $second , $month , $day , $year ));
2001-05-20 03:20:20 +02:00
}
2004-05-09 22:01:28 +02:00
// Note common:show_date converts server- to user-time, before it returns the requested format !!!
2001-09-23 21:38:24 +02:00
function localdates ( $localtime )
{
$date = Array ( 'raw' , 'day' , 'month' , 'year' , 'full' , 'dow' , 'dm' , 'bd' );
$date [ 'raw' ] = $localtime ;
2003-12-13 16:03:23 +01:00
$date [ 'year' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'Y' );
$date [ 'month' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'm' );
$date [ 'day' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'd' );
$date [ 'full' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'Ymd' );
2001-09-23 21:38:24 +02:00
$date [ 'bd' ] = mktime ( 0 , 0 , 0 , $date [ 'month' ], $date [ 'day' ], $date [ 'year' ]);
2003-12-13 16:03:23 +01:00
$date [ 'dm' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'dm' );
2001-09-23 21:38:24 +02:00
$date [ 'dow' ] = $this -> day_of_week ( $date [ 'year' ], $date [ 'month' ], $date [ 'day' ]);
2003-12-13 16:03:23 +01:00
$date [ 'hour' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'H' );
$date [ 'minute' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 'i' );
$date [ 'second' ] = ( int ) $GLOBALS [ 'phpgw' ] -> common -> show_date ( $date [ 'raw' ], 's' );
2001-05-20 03:20:20 +02:00
2001-09-23 21:38:24 +02:00
return $date ;
}
2001-05-20 03:20:20 +02:00
2001-09-23 21:38:24 +02:00
function gmtdate ( $localtime )
{
return $this -> localdates ( $localtime - $this -> tz_offset );
}
2001-05-20 03:20:20 +02:00
}
?>