2008-08-29 22:18:28 +02:00
< ? php
2011-05-25 15:27:07 +02:00
/* Copyright ( C ) 2004 - 2011 Laurent Destailleur < eldy @ users . sourceforge . net >
2012-12-30 15:13:49 +01:00
* Copyright ( C ) 2005 - 2011 Regis Houssin < regis . houssin @ capnetworks . com >
2015-04-18 19:14:30 +02:00
* Copyright ( C ) 2011 - 2015 Juanjo Menent < jmenent @ 2 byte . es >
2017-08-02 10:31:16 +02:00
* Copyright ( C ) 2017 Ferran Marcet < fmarcet @ 2 byte . es >
2008-08-29 22:18:28 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2008-08-29 22:18:28 +02:00
* ( at your option ) any later version .
*
* This program 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 General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2011-08-01 01:24:38 +02:00
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2008-08-29 22:18:28 +02:00
* or see http :// www . gnu . org /
*/
/**
2011-10-24 11:25:54 +02:00
* \file htdocs / core / lib / date . lib . php
2010-11-21 17:11:52 +01:00
* \brief Set of function to manipulate dates
2008-08-29 22:18:28 +02:00
*/
2011-06-10 22:31:10 +02:00
/**
* Return an array with timezone values
2011-09-16 19:19:24 +02:00
*
2011-06-10 22:31:10 +02:00
* @ return array Array with timezone values
*/
function get_tz_array ()
{
2012-01-22 02:12:11 +01:00
$tzarray = array (
- 11 => " Pacific/Midway " ,
- 10 => " Pacific/Fakaofo " ,
- 9 => " America/Anchorage " ,
- 8 => " America/Los_Angeles " ,
- 7 => " America/Dawson_Creek " ,
- 6 => " America/Chicago " ,
- 5 => " America/Bogota " ,
- 4 => " America/Anguilla " ,
- 3 => " America/Araguaina " ,
- 2 => " America/Noronha " ,
- 1 => " Atlantic/Azores " ,
0 => " Africa/Abidjan " ,
1 => " Europe/Paris " ,
2 => " Europe/Helsinki " ,
3 => " Europe/Moscow " ,
4 => " Asia/Dubai " ,
5 => " Asia/Karachi " ,
6 => " Indian/Chagos " ,
7 => " Asia/Jakarta " ,
8 => " Asia/Hong_Kong " ,
9 => " Asia/Tokyo " ,
10 => " Australia/Sydney " ,
11 => " Pacific/Noumea " ,
12 => " Pacific/Auckland " ,
13 => " Pacific/Enderbury "
);
2011-06-10 22:31:10 +02:00
return $tzarray ;
}
2011-11-01 04:57:45 +01:00
/**
2012-02-05 15:13:31 +01:00
* Return server timezone string
2011-11-01 04:57:45 +01:00
*
2012-02-05 15:13:31 +01:00
* @ return string PHP server timezone string ( 'Europe/Paris' )
2011-11-01 04:57:45 +01:00
*/
2012-02-06 05:31:19 +01:00
function getServerTimeZoneString ()
2011-11-01 04:57:45 +01:00
{
2014-03-21 18:05:08 +01:00
return @ date_default_timezone_get ();
2012-02-05 15:13:31 +01:00
}
/**
* Return server timezone int .
*
2012-05-14 16:46:48 +02:00
* @ param string $refgmtdate Reference period for timezone ( timezone differs on winter and summer . May be 'now' , 'winter' or 'summer' )
2012-02-07 10:25:58 +01:00
* @ return int An offset in hour ( + 1 for Europe / Paris on winter and + 2 for Europe / Paris on summer )
2012-02-05 15:13:31 +01:00
*/
2012-02-06 05:31:19 +01:00
function getServerTimeZoneInt ( $refgmtdate = 'now' )
2012-02-05 15:13:31 +01:00
{
global $conf ;
2014-03-21 15:02:27 +01:00
if ( method_exists ( 'DateTimeZone' , 'getOffset' ))
2012-02-05 15:13:31 +01:00
{
// Method 1 (include daylight)
2012-05-15 00:48:59 +02:00
$gmtnow = dol_now ( 'gmt' ); $yearref = dol_print_date ( $gmtnow , '%Y' ); $monthref = dol_print_date ( $gmtnow , '%m' ); $dayref = dol_print_date ( $gmtnow , '%d' );
if ( $refgmtdate == 'now' ) $newrefgmtdate = $yearref . '-' . $monthref . '-' . $dayref ;
2013-01-18 11:28:06 +01:00
elseif ( $refgmtdate == 'summer' ) $newrefgmtdate = $yearref . '-08-01' ;
2012-05-15 00:48:59 +02:00
else $newrefgmtdate = $yearref . '-01-01' ;
2015-07-28 18:12:45 +02:00
$newrefgmtdate .= 'T00:00:00+00:00' ;
2012-02-06 05:31:19 +01:00
$localtz = new DateTimeZone ( getServerTimeZoneString ());
2012-05-15 00:48:59 +02:00
$localdt = new DateTime ( $newrefgmtdate , $localtz );
2012-02-05 15:13:31 +01:00
$tmp =- 1 * $localtz -> getOffset ( $localdt );
2012-05-15 00:48:59 +02:00
//print $refgmtdate.'='.$tmp;
2012-02-05 15:13:31 +01:00
}
else
{
2015-03-14 14:55:41 +01:00
$tmp = 0 ;
2014-03-21 18:05:08 +01:00
dol_print_error ( '' , 'PHP version must be 5.3+' );
2012-02-05 15:13:31 +01:00
}
2012-05-15 00:48:59 +02:00
$tz = round (( $tmp < 0 ? 1 :- 1 ) * abs ( $tmp / 3600 ));
2011-11-01 04:57:45 +01:00
return $tz ;
}
2010-10-02 01:37:36 +02:00
/**
* Add a delay to a date
2011-09-16 19:19:24 +02:00
*
2013-11-07 21:12:11 +01:00
* @ param int $time Date timestamp ( or string with format YYYY - MM - DD )
2011-09-16 19:19:24 +02:00
* @ param int $duration_value Value of delay to add
2014-09-15 10:19:08 +02:00
* @ param int $duration_unit Unit of added delay ( d , m , y , w , h )
2014-09-05 13:48:55 +02:00
* @ return int New timestamp
2010-10-02 01:37:36 +02:00
*/
2016-02-16 00:31:05 +01:00
function dol_time_plus_duree ( $time , $duration_value , $duration_unit )
2010-10-02 01:37:36 +02:00
{
2017-09-11 02:09:48 +02:00
global $conf ;
2012-01-22 02:12:11 +01:00
if ( $duration_value == 0 ) return $time ;
2014-09-15 10:19:08 +02:00
if ( $duration_unit == 'h' ) return $time + ( 3600 * $duration_value );
2012-01-22 02:12:11 +01:00
if ( $duration_unit == 'w' ) return $time + ( 3600 * 24 * 7 * $duration_value );
2017-09-11 02:09:48 +02:00
2016-06-30 16:16:27 +02:00
$deltastring = 'P' ;
2017-09-11 02:09:48 +02:00
2016-06-30 16:16:27 +02:00
if ( $duration_value > 0 ){ $deltastring .= abs ( $duration_value ); $sub = false ; }
if ( $duration_value < 0 ){ $deltastring .= abs ( $duration_value ); $sub = true ; }
if ( $duration_unit == 'd' ) { $deltastring .= " D " ; }
if ( $duration_unit == 'm' ) { $deltastring .= " M " ; }
if ( $duration_unit == 'y' ) { $deltastring .= " Y " ; }
2017-09-11 02:09:48 +02:00
2016-06-30 16:16:27 +02:00
$date = new DateTime ();
2017-09-11 02:09:48 +02:00
if ( ! empty ( $conf -> global -> MAIN_DATE_IN_MEMORY_ARE_GMT )) $date -> setTimezone ( new DateTimeZone ( 'UTC' ));
2016-06-30 16:16:27 +02:00
$date -> setTimestamp ( $time );
$interval = new DateInterval ( $deltastring );
2017-09-11 02:09:48 +02:00
2016-06-30 16:16:27 +02:00
if ( $sub ) $date -> sub ( $interval );
else $date -> add ( $interval );
2017-09-11 02:09:48 +02:00
2016-06-30 16:16:27 +02:00
return $date -> getTimestamp ();
2010-10-02 01:37:36 +02:00
}
2012-02-04 14:39:47 +01:00
/**
* Convert hours and minutes into seconds
2011-09-16 19:19:24 +02:00
*
2012-02-04 14:39:47 +01:00
* @ param int $iHours Hours
* @ param int $iMinutes Minutes
* @ param int $iSeconds Seconds
* @ return int Time into seconds
2018-01-04 19:54:30 +01:00
* @ see convertSecondToTime
2008-08-29 22:18:28 +02:00
*/
2012-02-07 10:25:58 +01:00
function convertTime2Seconds ( $iHours = 0 , $iMinutes = 0 , $iSeconds = 0 )
2008-08-29 22:18:28 +02:00
{
$iResult = ( $iHours * 3600 ) + ( $iMinutes * 60 ) + $iSeconds ;
return $iResult ;
}
2018-01-04 19:54:30 +01:00
/** Return , in clear text , value of a number of seconds in days , hours and minutes .
* Can be used to show a duration .
2011-09-16 19:19:24 +02:00
*
* @ param int $iSecond Number of seconds
2018-05-27 15:04:12 +02:00
* @ param string $format Output format ( 'all' : total delay days hour : min like " 2 days 12:30 " ,
* 'allwithouthour' : total delay days without hour part like " 2 days " ,
* 'allhourmin' : total delay with format hours : min like " 60:30 " ,
* 'allhour' : total delay hours without min / sec like " 60:30 " ,
* 'fullhour' : total delay hour decimal like " 60.5 " for 60 : 30 ,
* 'hour' : only hours part " 12 " ,
* 'min' : only minutes part " 30 " ,
* 'sec' : only seconds part ,
* 'month' : only month part ,
* 'year' : only year part );
2011-09-16 19:19:24 +02:00
* @ param int $lengthOfDay Length of day ( default 86400 seconds for 1 day , 28800 for 8 hour )
* @ param int $lengthOfWeek Length of week ( default 7 )
2014-12-28 20:12:32 +01:00
* @ return string Formated text of duration
2011-09-16 19:19:24 +02:00
* Example : 0 return 00 : 00 , 3600 return 1 : 00 , 86400 return 1 d , 90000 return 1 Day 01 : 00
2018-01-04 19:54:30 +01:00
* @ see convertTime2Seconds
2008-08-29 22:18:28 +02:00
*/
2013-10-30 21:44:04 +01:00
function convertSecondToTime ( $iSecond , $format = 'all' , $lengthOfDay = 86400 , $lengthOfWeek = 7 )
2008-11-05 20:46:09 +01:00
{
2008-11-03 20:24:41 +01:00
global $langs ;
2009-11-17 12:25:11 +01:00
2011-02-19 15:14:05 +01:00
if ( empty ( $lengthOfDay )) $lengthOfDay = 86400 ; // 1 day = 24 hours
if ( empty ( $lengthOfWeek )) $lengthOfWeek = 7 ; // 1 week = 7 days
2008-11-05 20:46:09 +01:00
2015-08-20 15:50:00 +02:00
if ( $format == 'all' || $format == 'allwithouthour' || $format == 'allhour' || $format == 'allhourmin' )
2008-11-05 20:46:09 +01:00
{
2017-01-20 14:35:18 +01:00
if (( int ) $iSecond === 0 ) return '0' ; // This is to avoid having 0 return a 12:00 AM for en_US
2010-07-10 01:49:41 +02:00
2011-02-19 15:14:05 +01:00
$sTime = '' ;
2013-10-30 21:44:04 +01:00
$sDay = 0 ;
2017-01-16 09:30:28 +01:00
$sWeek = 0 ;
2011-02-19 15:14:05 +01:00
2009-10-29 09:57:05 +01:00
if ( $iSecond >= $lengthOfDay )
2008-11-03 20:24:41 +01:00
{
2009-11-17 12:25:11 +01:00
for ( $i = $iSecond ; $i >= $lengthOfDay ; $i -= $lengthOfDay )
2009-10-29 09:57:05 +01:00
{
$sDay ++ ;
2009-11-16 22:55:03 +01:00
$iSecond -= $lengthOfDay ;
2009-10-29 09:57:05 +01:00
}
2008-11-03 20:24:41 +01:00
$dayTranslate = $langs -> trans ( " Day " );
2009-10-29 09:57:05 +01:00
if ( $iSecond >= ( $lengthOfDay * 2 )) $dayTranslate = $langs -> trans ( " Days " );
2008-11-03 20:24:41 +01:00
}
2011-02-19 15:14:05 +01:00
if ( $lengthOfWeek < 7 )
{
if ( $sDay )
{
if ( $sDay >= $lengthOfWeek )
{
2011-09-20 11:40:27 +02:00
$sWeek = ( int ) (( $sDay - $sDay % $lengthOfWeek ) / $lengthOfWeek );
2011-02-19 15:14:05 +01:00
$sDay = $sDay % $lengthOfWeek ;
$weekTranslate = $langs -> trans ( " DurationWeek " );
if ( $sWeek >= 2 ) $weekTranslate = $langs -> trans ( " DurationWeeks " );
$sTime .= $sWeek . ' ' . $weekTranslate . ' ' ;
}
}
}
2012-06-10 12:42:19 +02:00
if ( $sDay > 0 )
{
$dayTranslate = $langs -> trans ( " Day " );
if ( $sDay > 1 ) $dayTranslate = $langs -> trans ( " Days " );
$sTime .= $sDay . ' ' . $dayTranslate . ' ' ;
}
2011-02-19 15:14:05 +01:00
2013-10-30 21:44:04 +01:00
if ( $format == 'all' )
{
if ( $iSecond || empty ( $sDay ))
{
$sTime .= dol_print_date ( $iSecond , 'hourduration' , true );
}
}
if ( $format == 'allhourmin' )
{
2017-01-16 09:30:28 +01:00
return sprintf ( " %02d " ,( $sWeek * $lengthOfWeek * 24 + $sDay * 24 + ( int ) floor ( $iSecond / 3600 ))) . ':' . sprintf ( " %02d " ,(( int ) floor (( $iSecond % 3600 ) / 60 )));
2013-10-30 21:44:04 +01:00
}
if ( $format == 'allhour' )
2009-10-29 08:53:33 +01:00
{
2013-10-30 21:44:04 +01:00
return sprintf ( " %02d " ,( $sWeek * $lengthOfWeek * 24 + $sDay * 24 + ( int ) floor ( $iSecond / 3600 )));
2009-10-29 08:53:33 +01:00
}
}
2013-10-30 21:44:04 +01:00
else if ( $format == 'hour' ) // only hour part
2009-10-29 08:53:33 +01:00
{
2009-11-17 12:27:55 +01:00
$sTime = dol_print_date ( $iSecond , '%H' , true );
2009-10-29 08:53:33 +01:00
}
2013-05-15 14:19:16 +02:00
else if ( $format == 'fullhour' )
{
if ( ! empty ( $iSecond )) {
$iSecond = $iSecond / 3600 ;
}
else {
$iSecond = 0 ;
}
$sTime = $iSecond ;
}
2013-10-30 21:44:04 +01:00
else if ( $format == 'min' ) // only min part
2009-10-29 08:53:33 +01:00
{
2009-12-03 20:25:35 +01:00
$sTime = dol_print_date ( $iSecond , '%M' , true );
2008-08-29 22:18:28 +02:00
}
2013-10-30 21:44:04 +01:00
else if ( $format == 'sec' ) // only sec part
2011-06-10 22:31:10 +02:00
{
$sTime = dol_print_date ( $iSecond , '%S' , true );
}
2013-10-30 21:44:04 +01:00
else if ( $format == 'month' ) // only month part
2011-08-20 17:11:31 +02:00
{
$sTime = dol_print_date ( $iSecond , '%m' , true );
}
2013-10-30 21:44:04 +01:00
else if ( $format == 'year' ) // only year part
2011-08-20 17:11:31 +02:00
{
$sTime = dol_print_date ( $iSecond , '%Y' , true );
}
return trim ( $sTime );
2008-08-29 22:18:28 +02:00
}
2012-01-21 14:10:22 +01:00
/**
* Convert a string date into a GM Timestamps date
2015-07-21 00:13:13 +02:00
* Warning : YYYY - MM - DDTHH : MM : SS + 02 : 00 ( RFC3339 ) is not supported . If parameter gm is 1 , we will use no TZ , if not we will use TZ of server , not the one inside string .
2012-01-21 14:10:22 +01:00
*
* @ param string $string Date in a string
* YYYYMMDD
* YYYYMMDDHHMMSS
* YYYYMMDDTHHMMSSZ
* YYYY - MM - DDTHH : MM : SSZ ( RFC3339 )
2015-04-23 23:21:06 +02:00
* DD / MM / YY or DD / MM / YYYY ( deprecated )
* DD / MM / YY HH : MM : SS or DD / MM / YYYY HH : MM : SS ( deprecated )
2012-01-22 02:12:11 +01:00
* @ param int $gm 1 = Input date is GM date ,
* 0 = Input date is local date using PHP server timezone
2013-11-07 21:12:11 +01:00
* @ return int Date as a timestamp
2012-01-22 02:12:11 +01:00
* 19700101020000 -> 7200 with gm = 1
2012-01-21 14:10:22 +01:00
*
* @ see dol_print_date , dol_mktime , dol_getdate
*/
2013-06-17 14:12:59 +02:00
function dol_stringtotime ( $string , $gm = 1 )
2012-01-21 14:10:22 +01:00
{
// Convert date with format DD/MM/YYY HH:MM:SS. This part of code should not be used.
if ( preg_match ( '/^([0-9]+)\/([0-9]+)\/([0-9]+)\s?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i' , $string , $reg ))
{
2015-04-23 23:21:06 +02:00
dol_syslog ( " dol_stringtotime call to function with deprecated parameter format " , LOG_WARNING );
2012-01-21 14:10:22 +01:00
// Date est au format 'DD/MM/YY' ou 'DD/MM/YY HH:MM:SS'
// Date est au format 'DD/MM/YYYY' ou 'DD/MM/YYYY HH:MM:SS'
$sday = $reg [ 1 ];
$smonth = $reg [ 2 ];
$syear = $reg [ 3 ];
$shour = $reg [ 4 ];
$smin = $reg [ 5 ];
$ssec = $reg [ 6 ];
if ( $syear < 50 ) $syear += 1900 ;
if ( $syear >= 50 && $syear < 100 ) $syear += 2000 ;
$string = sprintf ( " %04d%02d%02d%02d%02d%02d " , $syear , $smonth , $sday , $shour , $smin , $ssec );
}
2013-06-27 16:02:52 +02:00
else if (
2015-07-21 00:13:13 +02:00
preg_match ( '/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z$/i' , $string , $reg ) // Convert date with format YYYY-MM-DDTHH:MM:SSZ (RFC3339)
|| preg_match ( '/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/i' , $string , $reg ) // Convert date with format YYYY-MM-DD HH:MM:SS
2013-10-30 21:44:04 +01:00
|| preg_match ( '/^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})Z$/i' , $string , $reg ) // Convert date with format YYYYMMDDTHHMMSSZ
2013-06-27 16:02:52 +02:00
)
2012-01-21 14:10:22 +01:00
{
$syear = $reg [ 1 ];
$smonth = $reg [ 2 ];
$sday = $reg [ 3 ];
$shour = $reg [ 4 ];
$smin = $reg [ 5 ];
$ssec = $reg [ 6 ];
$string = sprintf ( " %04d%02d%02d%02d%02d%02d " , $syear , $smonth , $sday , $shour , $smin , $ssec );
}
$string = preg_replace ( '/([^0-9])/i' , '' , $string );
$tmp = $string . '000000' ;
2012-01-22 02:12:11 +01:00
$date = dol_mktime ( substr ( $tmp , 8 , 2 ), substr ( $tmp , 10 , 2 ), substr ( $tmp , 12 , 2 ), substr ( $tmp , 4 , 2 ), substr ( $tmp , 6 , 2 ), substr ( $tmp , 0 , 4 ),( $gm ? 1 : 0 ));
2012-01-21 14:10:22 +01:00
return $date ;
}
2011-02-02 16:51:18 +01:00
/** Return previous day
2011-09-16 19:19:24 +02:00
*
* @ param int $day Day
* @ param int $month Month
* @ param int $year Year
* @ return array Previous year , month , day
2011-02-02 16:51:18 +01:00
*/
function dol_get_prev_day ( $day , $month , $year )
{
2011-02-11 01:00:47 +01:00
$time = dol_mktime ( 12 , 0 , 0 , $month , $day , $year , 1 , 0 );
$time -= 24 * 60 * 60 ;
$tmparray = dol_getdate ( $time , true );
return array ( 'year' => $tmparray [ 'year' ], 'month' => $tmparray [ 'mon' ], 'day' => $tmparray [ 'mday' ]);
2011-02-02 16:51:18 +01:00
}
/** Return next day
2011-09-16 19:19:24 +02:00
*
* @ param int $day Day
* @ param int $month Month
* @ param int $year Year
* @ return array Next year , month , day
2011-02-02 16:51:18 +01:00
*/
function dol_get_next_day ( $day , $month , $year )
{
2011-02-11 01:00:47 +01:00
$time = dol_mktime ( 12 , 0 , 0 , $month , $day , $year , 1 , 0 );
$time += 24 * 60 * 60 ;
$tmparray = dol_getdate ( $time , true );
return array ( 'year' => $tmparray [ 'year' ], 'month' => $tmparray [ 'mon' ], 'day' => $tmparray [ 'mday' ]);
2011-02-02 16:51:18 +01:00
}
2010-10-02 01:37:36 +02:00
/** Return previous month
2011-09-16 19:19:24 +02:00
*
* @ param int $month Month
* @ param int $year Year
* @ return array Previous year , month
2008-08-29 22:18:28 +02:00
*/
function dol_get_prev_month ( $month , $year )
{
if ( $month == 1 )
{
$prev_month = 12 ;
$prev_year = $year - 1 ;
}
else
{
$prev_month = $month - 1 ;
$prev_year = $year ;
}
return array ( 'year' => $prev_year , 'month' => $prev_month );
}
2010-10-02 01:37:36 +02:00
/** Return next month
2011-09-16 19:19:24 +02:00
*
* @ param int $month Month
* @ param int $year Year
* @ return array Next year , month
2008-08-29 22:18:28 +02:00
*/
2010-01-12 00:25:54 +01:00
function dol_get_next_month ( $month , $year )
2008-08-29 22:18:28 +02:00
{
if ( $month == 12 )
{
$next_month = 1 ;
$next_year = $year + 1 ;
}
else
{
$next_month = $month + 1 ;
$next_year = $year ;
}
return array ( 'year' => $next_year , 'month' => $next_month );
}
2011-03-09 02:35:25 +01:00
/** Return previous week
2011-09-16 19:19:24 +02:00
*
* @ param int $day Day
* @ param int $week Week
* @ param int $month Month
* @ param int $year Year
* @ return array Previous year , month , day
2011-03-09 02:35:25 +01:00
*/
2011-03-09 17:53:30 +01:00
function dol_get_prev_week ( $day , $week , $month , $year )
2011-03-09 02:35:25 +01:00
{
2011-03-09 17:53:30 +01:00
$tmparray = dol_get_first_day_week ( $day , $month , $year );
2011-05-25 15:27:07 +02:00
2011-03-09 17:53:30 +01:00
$time = dol_mktime ( 12 , 0 , 0 , $month , $tmparray [ 'first_day' ], $year , 1 , 0 );
$time -= 24 * 60 * 60 * 7 ;
$tmparray = dol_getdate ( $time , true );
return array ( 'year' => $tmparray [ 'year' ], 'month' => $tmparray [ 'mon' ], 'day' => $tmparray [ 'mday' ]);
2011-03-09 02:35:25 +01:00
}
2011-05-25 15:27:07 +02:00
2011-03-09 02:35:25 +01:00
/** Return next week
2011-09-16 19:19:24 +02:00
*
* @ param int $day Day
* @ param int $week Week
* @ param int $month Month
* @ param int $year Year
* @ return array Next year , month , day
2011-03-09 02:35:25 +01:00
*/
2011-05-25 15:27:07 +02:00
function dol_get_next_week ( $day , $week , $month , $year )
2011-03-09 02:35:25 +01:00
{
2011-03-09 17:53:30 +01:00
$tmparray = dol_get_first_day_week ( $day , $month , $year );
2011-05-25 15:27:07 +02:00
2017-08-02 10:31:16 +02:00
$time = dol_mktime ( 12 , 0 , 0 , $tmparray [ 'first_month' ], $tmparray [ 'first_day' ], $tmparray [ 'first_year' ], 1 , 0 );
2011-03-09 17:53:30 +01:00
$time += 24 * 60 * 60 * 7 ;
$tmparray = dol_getdate ( $time , true );
2011-05-25 15:27:07 +02:00
2011-03-09 17:53:30 +01:00
return array ( 'year' => $tmparray [ 'year' ], 'month' => $tmparray [ 'mon' ], 'day' => $tmparray [ 'mday' ]);
2011-05-25 15:27:07 +02:00
2011-03-09 02:35:25 +01:00
}
2008-08-29 22:18:28 +02:00
2010-10-02 01:37:36 +02:00
/** Return GMT time for first day of a month or year
2011-09-16 19:19:24 +02:00
*
* @ param int $year Year
* @ param int $month Month
2014-03-21 16:22:41 +01:00
* @ param mixed $gm False or 0 or 'server' = Return date to compare with server TZ , True or 1 to compare with GM date .
2011-09-16 19:19:24 +02:00
* Exemple : dol_get_first_day ( 1970 , 1 , false ) will return - 3600 with TZ + 1 , after a dol_print_date will return 1970 - 01 - 01 00 : 00 : 00
* Exemple : dol_get_first_day ( 1970 , 1 , true ) will return 0 whatever is TZ , after a dol_print_date will return 1970 - 01 - 01 00 : 00 : 00
2014-10-29 20:21:24 +01:00
* @ return int Date for first day , '' if error
2009-12-03 20:25:35 +01:00
*/
2010-02-14 20:38:20 +01:00
function dol_get_first_day ( $year , $month = 1 , $gm = false )
2009-12-03 20:25:35 +01:00
{
2014-10-29 20:21:24 +01:00
if ( $year > 9999 ) return '' ;
2010-02-03 03:22:15 +01:00
return dol_mktime ( 0 , 0 , 0 , $month , 1 , $year , $gm );
2009-12-03 20:25:35 +01:00
}
2010-10-02 01:37:36 +02:00
/** Return GMT time for last day of a month or year
2011-09-16 19:19:24 +02:00
*
* @ param int $year Year
* @ param int $month Month
2014-03-21 16:22:41 +01:00
* @ param boolean $gm False or 0 or 'server' = Return date to compare with server TZ , True or 1 to compare with GM date .
2014-10-29 20:21:24 +01:00
* @ return int Date for first day , '' if error
2009-12-03 20:25:35 +01:00
*/
2010-02-14 20:38:20 +01:00
function dol_get_last_day ( $year , $month = 12 , $gm = false )
2009-12-03 20:25:35 +01:00
{
2014-10-29 20:21:24 +01:00
if ( $year > 9999 ) return '' ;
2009-12-03 20:25:35 +01:00
if ( $month == 12 )
{
$month = 1 ;
$year += 1 ;
}
else
{
$month += 1 ;
}
2010-01-12 00:25:54 +01:00
2009-12-03 20:25:35 +01:00
// On se deplace au debut du mois suivant, et on retire un jour
2010-02-03 03:22:15 +01:00
$datelim = dol_mktime ( 23 , 59 , 59 , $month , 1 , $year , $gm );
2009-12-03 20:25:35 +01:00
$datelim -= ( 3600 * 24 );
2010-01-12 00:25:54 +01:00
return $datelim ;
2009-12-03 20:25:35 +01:00
}
2015-02-03 11:25:51 +01:00
/** Return first day of week for a date . First day of week may be monday if option MAIN_START_WEEK is 1.
2011-09-16 19:19:24 +02:00
*
* @ param int $day Day
* @ param int $month Month
* @ param int $year Year
2014-03-21 16:22:41 +01:00
* @ param int $gm False or 0 or 'server' = Return date to compare with server TZ , True or 1 to compare with GM date .
2015-02-03 11:25:51 +01:00
* @ return array year , month , week , first_day , first_month , first_year , prev_day , prev_month , prev_year
2011-03-09 02:35:25 +01:00
*/
2011-05-25 15:27:07 +02:00
function dol_get_first_day_week ( $day , $month , $year , $gm = false )
2011-03-09 02:35:25 +01:00
{
2011-03-09 17:53:30 +01:00
global $conf ;
2011-05-25 15:27:07 +02:00
2015-02-03 11:25:51 +01:00
//$day=2; $month=2; $year=2015;
2011-03-09 23:56:50 +01:00
$date = dol_mktime ( 0 , 0 , 0 , $month , $day , $year , $gm );
2011-05-25 15:27:07 +02:00
2011-03-09 23:56:50 +01:00
//Checking conf of start week
$start_week = ( isset ( $conf -> global -> MAIN_START_WEEK ) ? $conf -> global -> MAIN_START_WEEK : 1 );
2011-05-25 15:27:07 +02:00
2015-02-03 11:25:51 +01:00
$tmparray = dol_getdate ( $date , true ); // detail of current day
2011-05-25 15:27:07 +02:00
2015-02-03 11:25:51 +01:00
//Calculate days = offset from current day
2011-03-09 23:56:50 +01:00
$days = $start_week - $tmparray [ 'wday' ];
if ( $days >= 1 ) $days = 7 - $days ;
$days = abs ( $days );
$seconds = $days * 24 * 60 * 60 ;
2015-02-03 11:25:51 +01:00
//print 'start_week='.$start_week.' tmparray[wday]='.$tmparray['wday'].' day offset='.$days.' seconds offset='.$seconds.'<br>';
2011-05-25 15:27:07 +02:00
2011-03-09 23:56:50 +01:00
//Get first day of week
2015-02-03 11:25:51 +01:00
$tmpdaytms = date ( $tmparray [ 0 ]) - $seconds ; // $tmparray[0] is day of parameters
$tmpday = date ( " d " , $tmpdaytms );
2011-05-25 15:27:07 +02:00
2014-09-05 13:48:55 +02:00
//Check first day of week is in same month than current day or not
2011-03-09 17:53:30 +01:00
if ( $tmpday > $day )
{
$prev_month = $month - 1 ;
$prev_year = $year ;
2011-05-25 15:27:07 +02:00
2011-03-09 17:53:30 +01:00
if ( $prev_month == 0 )
{
$prev_month = 12 ;
$prev_year = $year - 1 ;
}
}
2011-05-25 15:27:07 +02:00
else
2011-03-09 17:53:30 +01:00
{
$prev_month = $month ;
$prev_year = $year ;
}
2014-09-05 13:48:55 +02:00
$tmpmonth = $prev_month ;
$tmpyear = $prev_year ;
2011-03-09 23:56:50 +01:00
2014-09-07 12:22:04 +02:00
//Get first day of next week
2011-03-09 17:53:30 +01:00
$tmptime = dol_mktime ( 12 , 0 , 0 , $month , $tmpday , $year , 1 , 0 );
$tmptime -= 24 * 60 * 60 * 7 ;
$tmparray = dol_getdate ( $tmptime , true );
$prev_day = $tmparray [ 'mday' ];
2011-05-25 15:27:07 +02:00
2014-09-05 13:48:55 +02:00
//Check prev day of week is in same month than first day or not
2014-09-07 12:22:04 +02:00
if ( $prev_day > $tmpday )
2011-03-09 17:53:30 +01:00
{
$prev_month = $month - 1 ;
$prev_year = $year ;
2011-05-25 15:27:07 +02:00
2011-03-09 17:53:30 +01:00
if ( $prev_month == 0 )
{
$prev_month = 12 ;
$prev_year = $year - 1 ;
}
}
2011-05-25 15:27:07 +02:00
2014-09-05 15:10:31 +02:00
$week = date ( " W " , dol_mktime ( 0 , 0 , 0 , $tmpmonth , $tmpday , $tmpyear , $gm ));
2011-05-25 15:27:07 +02:00
2014-09-05 13:48:55 +02:00
return array ( 'year' => $year , 'month' => $month , 'week' => $week , 'first_day' => $tmpday , 'first_month' => $tmpmonth , 'first_year' => $tmpyear , 'prev_year' => $prev_year , 'prev_month' => $prev_month , 'prev_day' => $prev_day );
2011-03-09 02:35:25 +01:00
}
2009-12-03 20:25:35 +01:00
2008-08-29 22:18:28 +02:00
/**
2014-03-05 21:29:33 +01:00
* Fonction retournant le nombre de jour feries , samedis et dimanches entre 2 dates entrees en timestamp . Dates must be UTC with hour , day , min to 0
2011-05-25 15:27:07 +02:00
* Called by function num_open_day
2011-09-16 19:19:24 +02:00
*
2014-04-23 15:48:20 +02:00
* @ param int $timestampStart Timestamp de debut
* @ param int $timestampEnd Timestamp de fin
2011-09-16 19:19:24 +02:00
* @ param string $countrycode Country code
2015-11-28 16:11:15 +01:00
* @ param int $lastday Last day is included , 0 : no , 1 : yes
2011-09-16 19:19:24 +02:00
* @ return int Nombre de jours feries
2015-11-28 19:54:16 +01:00
* @ see num_between_day , num_open_day
2008-08-29 22:18:28 +02:00
*/
2015-11-28 16:11:15 +01:00
function num_public_holiday ( $timestampStart , $timestampEnd , $countrycode = 'FR' , $lastday = 0 )
2008-08-29 22:18:28 +02:00
{
2018-10-11 13:12:13 +02:00
global $conf ;
2008-08-29 22:18:28 +02:00
$nbFerie = 0 ;
2014-03-05 21:29:33 +01:00
// Check to ensure we use correct parameters
2014-11-02 21:16:31 +01:00
if ((( $timestampEnd - $timestampStart ) % 86400 ) != 0 ) return 'ErrorDates must use same hours and must be GMT dates' ;
2014-03-05 21:29:33 +01:00
2014-11-02 21:16:31 +01:00
$i = 0 ;
2015-11-28 16:11:15 +01:00
while (( ( $lastday == 0 && $timestampStart < $timestampEnd ) || ( $lastday && $timestampStart <= $timestampEnd ) )
&& ( $i < 50000 )) // Loop end when equals (Test on i is a security loop to avoid infinite loop)
2008-08-29 22:18:28 +02:00
{
$ferie = false ;
$countryfound = 0 ;
$jour = date ( " d " , $timestampStart );
$mois = date ( " m " , $timestampStart );
$annee = date ( " Y " , $timestampStart );
2018-10-11 13:12:13 +02:00
// Check into var $conf->global->HOLIDAY_MORE_DAYS MM-DD,YYYY-MM-DD, ...
if ( ! empty ( $conf -> global -> HOLIDAY_MORE_PUBLIC_HOLIDAYS ))
{
$arrayofdaystring = explode ( ',' , $conf -> global -> HOLIDAY_MORE_PUBLIC_HOLIDAYS );
foreach ( $arrayofdaystring as $daystring )
{
$tmp = explode ( '-' , $daystring );
if ( $tmp [ 2 ])
{
if ( $tmp [ 0 ] == $annee && $tmp [ 1 ] == $mois && $tmp [ 2 ] == $jour ) $ferie = true ;
}
else
{
if ( $tmp [ 0 ] == $mois && $tmp [ 1 ] == $jour ) $ferie = true ;
}
}
}
2008-08-29 22:18:28 +02:00
if ( $countrycode == 'FR' )
{
$countryfound = 1 ;
2018-04-27 09:49:15 +02:00
// Definition of fixed working days
2018-04-27 09:49:52 +02:00
if ( $jour == 1 && $mois == 1 ) $ferie = true ; // 1er january
if ( $jour == 1 && $mois == 5 ) $ferie = true ; // 1er may
if ( $jour == 8 && $mois == 5 ) $ferie = true ; // 5 may
if ( $jour == 14 && $mois == 7 ) $ferie = true ; // 14 july
if ( $jour == 15 && $mois == 8 ) $ferie = true ; // 15 august
if ( $jour == 1 && $mois == 11 ) $ferie = true ; // 1 november
if ( $jour == 11 && $mois == 11 ) $ferie = true ; // 11 november
if ( $jour == 25 && $mois == 12 ) $ferie = true ; // 25 december
2008-08-29 22:18:28 +02:00
2018-04-27 09:49:15 +02:00
// Calculation for easter date
2008-08-29 22:18:28 +02:00
$date_paques = easter_date ( $annee );
$jour_paques = date ( " d " , $date_paques );
$mois_paques = date ( " m " , $date_paques );
if ( $jour_paques == $jour && $mois_paques == $mois ) $ferie = true ;
2018-04-23 15:14:34 +02:00
// Pâques
2008-08-29 22:18:28 +02:00
2018-04-27 09:49:15 +02:00
// Calculation for the monday of easter date
2018-04-23 15:14:34 +02:00
$date_lundi_paques = mktime (
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) + 1 ,
date ( " Y " , $date_paques )
);
$jour_lundi_ascension = date ( " d " , $date_lundi_paques );
$mois_lundi_ascension = date ( " m " , $date_lundi_paques );
if ( $jour_lundi_ascension == $jour && $mois_lundi_ascension == $mois ) $ferie = true ;
// Lundi de Pâques
2018-04-27 09:49:15 +02:00
// Calcul du jour de l'ascension (38 days after easter day)
2012-04-02 18:37:37 +02:00
$date_ascension = mktime (
2011-09-16 19:19:24 +02:00
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
2018-04-23 15:14:34 +02:00
date ( " d " , $date_paques ) + 39 ,
2011-09-16 19:19:24 +02:00
date ( " Y " , $date_paques )
2012-05-25 11:53:53 +02:00
);
2008-08-29 22:18:28 +02:00
$jour_ascension = date ( " d " , $date_ascension );
$mois_ascension = date ( " m " , $date_ascension );
if ( $jour_ascension == $jour && $mois_ascension == $mois ) $ferie = true ;
2018-04-23 15:14:34 +02:00
// Ascension
2008-08-29 22:18:28 +02:00
2018-04-27 09:49:15 +02:00
// Calculation of "Pentecote" (11 days after easter day)
2012-05-25 11:53:53 +02:00
$date_pentecote = mktime (
2018-04-23 15:14:34 +02:00
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) + 49 ,
date ( " Y " , $date_paques )
2012-05-25 11:53:53 +02:00
);
2008-08-29 22:18:28 +02:00
$jour_pentecote = date ( " d " , $date_pentecote );
$mois_pentecote = date ( " m " , $date_pentecote );
if ( $jour_pentecote == $jour && $mois_pentecote == $mois ) $ferie = true ;
2018-04-27 09:55:44 +02:00
// "Pentecote"
2008-08-29 22:18:28 +02:00
// Calul des samedis et dimanches
$jour_julien = unixtojd ( $timestampStart );
$jour_semaine = jddayofweek ( $jour_julien , 0 );
if ( $jour_semaine == 0 || $jour_semaine == 6 ) $ferie = true ;
2018-04-23 15:14:34 +02:00
// Samedi (6) et dimanche (0)
2008-08-29 22:18:28 +02:00
}
2011-02-11 01:00:47 +01:00
// Pentecoste and Ascensione in Italy go to the sunday after: isn't holiday.
// Pentecoste is 50 days after Easter, Ascensione 40
if ( $countrycode == 'IT' )
{
$countryfound = 1 ;
// Definition des dates feriees fixes
if ( $jour == 1 && $mois == 1 ) $ferie = true ; // Capodanno
if ( $jour == 6 && $mois == 1 ) $ferie = true ; // Epifania
if ( $jour == 25 && $mois == 4 ) $ferie = true ; // Anniversario Liberazione
if ( $jour == 1 && $mois == 5 ) $ferie = true ; // Festa del Lavoro
if ( $jour == 2 && $mois == 6 ) $ferie = true ; // Festa della Repubblica
if ( $jour == 15 && $mois == 8 ) $ferie = true ; // Ferragosto
if ( $jour == 1 && $mois == 11 ) $ferie = true ; // Tutti i Santi
if ( $jour == 8 && $mois == 12 ) $ferie = true ; // Immacolata Concezione
if ( $jour == 25 && $mois == 12 ) $ferie = true ; // 25 decembre
if ( $jour == 26 && $mois == 12 ) $ferie = true ; // Santo Stefano
// Calcul du jour de paques
$date_paques = easter_date ( $annee );
$jour_paques = date ( " d " , $date_paques );
$mois_paques = date ( " m " , $date_paques );
if ( $jour_paques == $jour && $mois_paques == $mois ) $ferie = true ;
// Paques
2008-08-29 22:18:28 +02:00
2011-02-11 01:00:47 +01:00
// Calul des samedis et dimanches
$jour_julien = unixtojd ( $timestampStart );
2014-07-10 12:06:09 +02:00
$jour_semaine = jddayofweek ( $jour_julien , 0 );
if ( $jour_semaine == 0 || $jour_semaine == 6 ) $ferie = true ;
//Samedi (6) et dimanche (0)
}
2014-09-05 13:48:55 +02:00
2014-07-10 12:06:09 +02:00
if ( $countrycode == 'ES' )
{
$countryfound = 1 ;
// Definition des dates feriees fixes
if ( $jour == 1 && $mois == 1 ) $ferie = true ; // Año nuevo
if ( $jour == 6 && $mois == 1 ) $ferie = true ; // Día Reyes
if ( $jour == 1 && $mois == 5 ) $ferie = true ; // 1 Mayo
if ( $jour == 15 && $mois == 8 ) $ferie = true ; // 15 Agosto
if ( $jour == 12 && $mois == 10 ) $ferie = true ; // Día Hispanidad
if ( $jour == 1 && $mois == 11 ) $ferie = true ; // 1 noviembre
if ( $jour == 6 && $mois == 12 ) $ferie = true ; // Constitución
if ( $jour == 8 && $mois == 12 ) $ferie = true ; // Inmaculada
if ( $jour == 25 && $mois == 12 ) $ferie = true ; // 25 diciembre
// Calcul día de Pascua
$date_paques = easter_date ( $annee );
$jour_paques = date ( " d " , $date_paques );
$mois_paques = date ( " m " , $date_paques );
if ( $jour_paques == $jour && $mois_paques == $mois ) $ferie = true ;
// Paques
// Viernes Santo
$date_viernes = mktime (
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) - 2 ,
date ( " Y " , $date_paques )
);
$jour_viernes = date ( " d " , $date_viernes );
$mois_viernes = date ( " m " , $date_viernes );
if ( $jour_viernes == $jour && $mois_viernes == $mois ) $ferie = true ;
//Viernes Santo
// Calul des samedis et dimanches
$jour_julien = unixtojd ( $timestampStart );
2011-02-11 01:00:47 +01:00
$jour_semaine = jddayofweek ( $jour_julien , 0 );
if ( $jour_semaine == 0 || $jour_semaine == 6 ) $ferie = true ;
//Samedi (6) et dimanche (0)
}
2008-08-29 22:18:28 +02:00
2017-12-11 10:51:58 +01:00
if ( $countrycode == 'AT' )
{
$countryfound = 1 ;
2018-01-04 19:54:30 +01:00
2017-12-11 10:51:58 +01:00
// Definition des dates feriees fixes
if ( $jour == 1 && $mois == 1 ) $ferie = true ; // Neujahr
if ( $jour == 6 && $mois == 1 ) $ferie = true ; // Hl. 3 Koenige
if ( $jour == 1 && $mois == 5 ) $ferie = true ; // 1. Mai
if ( $jour == 15 && $mois == 8 ) $ferie = true ; // Mariae Himmelfahrt
if ( $jour == 26 && $mois == 10 ) $ferie = true ; // 26. Oktober
if ( $jour == 1 && $mois == 11 ) $ferie = true ; // Allerheiligen
if ( $jour == 8 && $mois == 12 ) $ferie = true ; // Mariae Empfaengnis
if ( $jour == 24 && $mois == 12 ) $ferie = true ; // Heilig abend
if ( $jour == 25 && $mois == 12 ) $ferie = true ; // Christtag
if ( $jour == 26 && $mois == 12 ) $ferie = true ; // Stefanietag
if ( $jour == 31 && $mois == 12 ) $ferie = true ; // Silvester
2018-01-04 19:54:30 +01:00
2017-12-11 10:51:58 +01:00
// Easter calculation
$date_paques = easter_date ( $annee );
$jour_paques = date ( " d " , $date_paques );
$mois_paques = date ( " m " , $date_paques );
if ( $jour_paques == $jour && $mois_paques == $mois ) $ferie = true ;
// Easter sunday
2018-01-04 19:54:30 +01:00
2017-12-11 10:51:58 +01:00
// Monday after easter
$date_eastermonday = mktime (
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) + 1 ,
date ( " Y " , $date_paques )
);
$jour_eastermonday = date ( " d " , $date_eastermonday );
$mois_eastermonday = date ( " m " , $date_eastermonday );
if ( $jour_eastermonday == $jour && $mois_eastermonday == $mois ) $ferie = true ;
// Easter monday
2018-01-04 19:54:30 +01:00
2017-12-11 10:51:58 +01:00
// Christi Himmelfahrt (39 days after easter sunday)
$date_ch = mktime (
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) + 39 ,
date ( " Y " , $date_paques )
);
$jour_ch = date ( " d " , $date_ch );
$mois_ch = date ( " m " , $date_ch );
if ( $jour_ch == $jour && $mois_ch == $mois ) $ferie = true ;
// Christi Himmelfahrt
2018-01-04 19:54:30 +01:00
2017-12-11 10:51:58 +01:00
// Pfingsten (50 days after easter sunday)
$date_pentecote = mktime (
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) + 50 ,
date ( " Y " , $date_paques )
);
$jour_pentecote = date ( " d " , $date_pentecote );
$mois_pentecote = date ( " m " , $date_pentecote );
if ( $jour_pentecote == $jour && $mois_pentecote == $mois ) $ferie = true ;
// Pfingsten
2018-01-04 19:54:30 +01:00
2017-12-11 10:51:58 +01:00
// Fronleichnam (60 days after easter sunday)
$date_fronleichnam = mktime (
date ( " H " , $date_paques ),
date ( " i " , $date_paques ),
date ( " s " , $date_paques ),
date ( " m " , $date_paques ),
date ( " d " , $date_paques ) + 60 ,
date ( " Y " , $date_paques )
);
$jour_fronleichnam = date ( " d " , $date_fronleichnam );
$mois_fronleichnam = date ( " m " , $date_fronleichnam );
if ( $jour_fronleichnam == $jour && $mois_fronleichnam == $mois ) $ferie = true ;
// Fronleichnam
// Calul des samedis et dimanches
$jour_julien = unixtojd ( $timestampStart );
$jour_semaine = jddayofweek ( $jour_julien , 0 );
if ( $jour_semaine == 0 || $jour_semaine == 6 ) $ferie = true ;
//Samedi (6) et dimanche (0)
}
2008-08-29 22:18:28 +02:00
// Cas pays non defini
if ( ! $countryfound )
{
// Calul des samedis et dimanches
$jour_julien = unixtojd ( $timestampStart );
$jour_semaine = jddayofweek ( $jour_julien , 0 );
if ( $jour_semaine == 0 || $jour_semaine == 6 ) $ferie = true ;
//Samedi (6) et dimanche (0)
}
// On incremente compteur
if ( $ferie ) $nbFerie ++ ;
2014-03-05 21:29:33 +01:00
// Increase number of days (on go up into loop)
2014-11-02 21:16:31 +01:00
$timestampStart = dol_time_plus_duree ( $timestampStart , 1 , 'd' );
//var_dump($jour.' '.$mois.' '.$annee.' '.$timestampStart);
$i ++ ;
2008-08-29 22:18:28 +02:00
}
return $nbFerie ;
}
/**
2014-03-05 20:52:27 +01:00
* Function to return number of days between two dates ( date must be UTC date ! )
2012-09-24 21:37:19 +02:00
* Example : 2012 - 01 - 01 2012 - 01 - 02 => 1 if lastday = 0 , 2 if lastday = 1
2011-09-16 19:19:24 +02:00
*
2014-04-23 15:48:20 +02:00
* @ param int $timestampStart Timestamp start UTC
* @ param int $timestampEnd Timestamp end UTC
2015-11-28 16:11:15 +01:00
* @ param int $lastday Last day is included , 0 : no , 1 : yes
2012-09-24 21:37:19 +02:00
* @ return int Number of days
2015-11-28 19:54:16 +01:00
* @ see also num_public_holiday , num_open_day
2008-08-29 22:18:28 +02:00
*/
function num_between_day ( $timestampStart , $timestampEnd , $lastday = 0 )
{
if ( $timestampStart < $timestampEnd )
{
if ( $lastday == 1 )
{
$bit = 0 ;
}
else
{
$bit = 1 ;
}
2012-09-24 21:37:19 +02:00
$nbjours = ( int ) floor (( $timestampEnd - $timestampStart ) / ( 60 * 60 * 24 )) + 1 - $bit ;
2008-08-29 22:18:28 +02:00
}
2012-09-24 21:37:19 +02:00
//print ($timestampEnd - $timestampStart) - $lastday;
2008-08-29 22:18:28 +02:00
return $nbjours ;
}
/**
2012-12-18 13:12:11 +01:00
* Function to return number of working days ( and text of units ) between two dates ( working days )
2011-09-16 19:19:24 +02:00
*
2014-04-23 15:48:20 +02:00
* @ param int $timestampStart Timestamp for start date ( date must be UTC to avoid calculation errors )
* @ param int $timestampEnd Timestamp for end date ( date must be UTC to avoid calculation errors )
2014-03-05 20:52:27 +01:00
* @ param int $inhour 0 : return number of days , 1 : return number of hours
2012-12-18 13:12:11 +01:00
* @ param int $lastday We include last day , 0 : no , 1 : yes
* @ param int $halfday Tag to define half day when holiday start and end
2014-11-02 22:04:01 +01:00
* @ param string $country_code Country code ( company country code if not defined )
2012-12-18 13:12:11 +01:00
* @ return int Number of days or hours
2015-11-28 19:54:16 +01:00
* @ see also num_between_day , num_public_holiday
2008-08-29 22:18:28 +02:00
*/
2014-11-02 21:16:31 +01:00
function num_open_day ( $timestampStart , $timestampEnd , $inhour = 0 , $lastday = 0 , $halfday = 0 , $country_code = '' )
2008-08-29 22:18:28 +02:00
{
2014-11-02 21:16:31 +01:00
global $langs , $mysoc ;
if ( empty ( $country_code )) $country_code = $mysoc -> country_code ;
2008-08-29 22:18:28 +02:00
2014-11-02 21:16:31 +01:00
dol_syslog ( 'num_open_day timestampStart=' . $timestampStart . ' timestampEnd=' . $timestampEnd . ' bit=' . $lastday . ' country_code=' . $country_code );
2013-01-18 11:28:06 +01:00
2012-11-20 13:14:16 +01:00
// Check parameters
if ( ! is_int ( $timestampStart ) && ! is_float ( $timestampStart )) return 'ErrorBadParameter_num_open_day' ;
if ( ! is_int ( $timestampEnd ) && ! is_float ( $timestampEnd )) return 'ErrorBadParameter_num_open_day' ;
2012-09-24 21:37:19 +02:00
//print 'num_open_day timestampStart='.$timestampStart.' timestampEnd='.$timestampEnd.' bit='.$lastday;
2008-08-29 22:18:28 +02:00
if ( $timestampStart < $timestampEnd )
{
2014-11-02 21:16:31 +01:00
$numdays = num_between_day ( $timestampStart , $timestampEnd , $lastday );
2015-11-28 16:11:15 +01:00
$numholidays = num_public_holiday ( $timestampStart , $timestampEnd , $country_code , $lastday );
2014-11-02 21:16:31 +01:00
$nbOpenDay = $numdays - $numholidays ;
2012-11-20 13:14:16 +01:00
$nbOpenDay .= " " . $langs -> trans ( " Days " );
2008-08-29 22:18:28 +02:00
if ( $inhour == 1 && $nbOpenDay <= 3 ) $nbOpenDay = $nbOpenDay * 24 . $langs -> trans ( " HourShort " );
2012-12-18 13:12:11 +01:00
return $nbOpenDay - (( $inhour == 1 ? 12 : 0.5 ) * abs ( $halfday ));
2008-08-29 22:18:28 +02:00
}
2012-09-24 21:37:19 +02:00
elseif ( $timestampStart == $timestampEnd )
{
$nbOpenDay = $lastday ;
if ( $inhour == 1 ) $nbOpenDay = $nbOpenDay * 24 . $langs -> trans ( " HourShort " );
2012-12-18 13:12:11 +01:00
return $nbOpenDay - (( $inhour == 1 ? 12 : 0.5 ) * abs ( $halfday ));
2012-09-24 21:37:19 +02:00
}
2008-08-29 22:18:28 +02:00
else
{
return $langs -> trans ( " Error " );
}
}
2011-08-17 18:07:41 +02:00
/**
2012-03-14 23:11:49 +01:00
* Return array of translated months or selected month .
* This replace old function monthArrayOrSelected .
2011-08-17 18:07:41 +02:00
*
2012-02-04 14:39:47 +01:00
* @ param Translate $outputlangs Object langs
2015-03-22 18:17:25 +01:00
* @ param int $short 1 = Return short label
2012-01-24 09:19:28 +01:00
* @ return array Month string or array if selected < 0
2011-08-17 18:07:41 +02:00
*/
2015-03-22 18:17:25 +01:00
function monthArray ( $outputlangs , $short = 0 )
2011-08-17 18:07:41 +02:00
{
2015-03-22 18:17:25 +01:00
$montharray = array (
2012-01-24 09:19:28 +01:00
1 => $outputlangs -> trans ( " January " ),
2 => $outputlangs -> trans ( " February " ),
3 => $outputlangs -> trans ( " March " ),
4 => $outputlangs -> trans ( " April " ),
5 => $outputlangs -> trans ( " May " ),
6 => $outputlangs -> trans ( " June " ),
7 => $outputlangs -> trans ( " July " ),
8 => $outputlangs -> trans ( " August " ),
9 => $outputlangs -> trans ( " September " ),
10 => $outputlangs -> trans ( " October " ),
11 => $outputlangs -> trans ( " November " ),
12 => $outputlangs -> trans ( " December " )
2011-08-17 18:07:41 +02:00
);
2015-03-22 18:17:25 +01:00
if ( ! empty ( $short ))
{
$montharray = array (
2015-04-18 19:14:30 +02:00
1 => $outputlangs -> trans ( " JanuaryMin " ),
2 => $outputlangs -> trans ( " FebruaryMin " ),
3 => $outputlangs -> trans ( " MarchMin " ),
4 => $outputlangs -> trans ( " AprilMin " ),
5 => $outputlangs -> trans ( " MayMin " ),
6 => $outputlangs -> trans ( " JuneMin " ),
7 => $outputlangs -> trans ( " JulyMin " ),
8 => $outputlangs -> trans ( " AugustMin " ),
9 => $outputlangs -> trans ( " SeptemberMin " ),
10 => $outputlangs -> trans ( " OctoberMin " ),
11 => $outputlangs -> trans ( " NovemberMin " ),
12 => $outputlangs -> trans ( " DecemberMin " )
2015-03-22 18:17:25 +01:00
);
}
return $montharray ;
2011-08-17 18:07:41 +02:00
}