web-dev-qa-db-fra.com

Prochain jour ouvrable de la date donnée en PHP

Quelqu'un a-t-il un extrait {PHP pour calculer le prochain jour ouvrable à une date donnée? Comment, par exemple, AAAA-MM-JJ doit-il être converti pour connaître le prochain jour ouvrable? ?

Exemple: Pour le 03.04.2011 (JJ-MM-AAAA), le prochain jour ouvrable est le 04.04.2011. Pour le 08.04.2011, le jour ouvrable suivant est le 11.04.2011.

Ceci est la variable contenant la date que je dois connaître le jour ouvrable suivant pour

$cubeTime['time'];

La variable contient: 2011-04-01 Le résultat de l'extrait de code devrait être: 2011-04-04

21
Marko

Jour de la semaine prochaine

Cela permet de trouver le prochain jour de la semaine à partir d’une date donnée (samedi et dimanche non compris):

echo date('Y-m-d', strtotime('2011-04-05 +1 Weekday'));

Vous pouvez aussi le faire avec une variable de date bien sûr:

$myDate = '2011-04-05';
echo date('Y-m-d', strtotime($myDate . ' +1 Weekday'));

UPDATE: Ou, si vous avez accès à La classe DateTime de PHP (très probablement):

$date = new DateTime('2018-01-27');
$date->modify('+7 weekday');
echo $date->format('Y-m-d');

Voulez-vous éviter les vacances ?:

Bien que l'affiche originale mentionne "Je n'ai pas besoin de considérer les vacances", si vous voulez ignorer les vacances, rappelez-vous - "Vacances" est simplement un tableau des dates que vous ne voulez pas inclure et diffère selon les pays , région, entreprise, personne, etc.

Placez simplement le code ci-dessus dans une fonction qui exclut/boucle les dates que vous ne souhaitez pas inclure. Quelque chose comme ça:

$tmpDate = '2015-06-22';
$holidays = ['2015-07-04', '2015-10-31', '2015-12-25'];
$i = 1;
$nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));

while (in_array($nextBusinessDay, $holidays)) {
    $i++;
    $nextBusinessDay = date('Y-m-d', strtotime($tmpDate . ' +' . $i . ' Weekday'));
}

Je suis sûr que le code ci-dessus peut être simplifié ou abrégé si vous le souhaitez. J'ai essayé de l'écrire d'une manière facile à comprendre.

79
Dave

Pour les vacances au Royaume-Uni, vous pouvez utiliser

https://www.gov.uk/bank-holidays#england-and-wales

Les données de format ICS sont faciles à analyser. Ma suggestion est ...

# $date must be in YYYY-MM-DD format
# You can pass in either an array of holidays in YYYYMMDD format
# OR a URL for a .ics file containing holidays
# this defaults to the UK government holiday data for England and Wales
function addBusinessDays($date,$numDays=1,$holidays='') {
    if ($holidays==='') $holidays = 'https://www.gov.uk/bank-holidays/england-and-wales.ics';

    if (!is_array($holidays)) {
        $ch = curl_init($holidays);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        $ics = curl_exec($ch);
        curl_close($ch);
        $ics = explode("\n",$ics);
        $ics = preg_grep('/^DTSTART;/',$ics);
        $holidays = preg_replace('/^DTSTART;VALUE=DATE:(\\d{4})(\\d{2})(\\d{2}).*/s','$1-$2-$3',$ics);
    }

    $addDay = 0;
    while ($numDays--) {
        while (true) {
            $addDay++;
            $newDate = date('Y-m-d', strtotime("$date +$addDay Days"));
            $newDayOfWeek = date('w', strtotime($newDate));
            if ( $newDayOfWeek>0 && $newDayOfWeek<6 && !in_array($newDate,$holidays)) break;
        }
    }

    return $newDate;
}
3
user2412642
function next_business_day($date) {
  $add_day = 0;
  do {
    $add_day++;
    $new_date = date('Y-m-d', strtotime("$date +$add_day Days"));
    $new_day_of_week = date('w', strtotime($new_date));
  } while($new_day_of_week == 6 || $new_day_of_week == 0);

  return $new_date;
}

Cette fonction devrait ignorer les week-ends (6 = samedi et 0 = dimanche).

1
mhitza

Cette fonction calculera le jour ouvrable futur ou passé. Les arguments sont le nombre de jours, en avant (1) ou en arrière (0) et une date. Si aucune date n'est fournie, la date du jour sera utilisée:

// returned $date Y/m/d
function work_days_from_date($days, $forward, $date=NULL) 
{
    if(!$date)
    {
        $date = date('Y-m-d'); // if no date given, use todays date
    }

    while ($days != 0) 
    {
        $forward == 1 ? $day = strtotime($date.' +1 day') : $day = strtotime($date.' -1 day');
        $date = date('Y-m-d',$day);
        if( date('N', strtotime($date)) <= 5) // if it's a weekday
        {
          $days--;
        }
    }
    return $date;
}
0
Angus

Je suis tombé par hasard sur ce sujet lorsque je travaillais sur un site Web danois où je devais coder un script "Livraison le lendemain" PHP.

Voici ce que je suis venu avec (Cela affichera le nom du prochain jour ouvrable en danois, et le prochain jour ouvrable + 1 si l'heure actuelle est supérieure à une limite donnée)

$day["Mon"] = "Mandag"; 
$day["Tue"] = "Tirsdag";
$day["Wed"] = "Onsdag";
$day["Thu"] = "Torsdag";
$day["Fri"] = "Fredag";
$day["Sat"] = "Lørdag";
$day["Sun"] = "Søndag";

date_default_timezone_set('Europe/Copenhagen');

$date = date('l');
$checkTime = '1400';
$date2 = date(strtotime($date.' +1 Weekday'));
if( date( 'Hi' ) >= $checkTime) {
$date2 = date(strtotime($date.' +2 Weekday'));
}
if (date('l') == 'Saturday'){
$date2 = date(strtotime($date.' +2 Weekday'));
}
if (date('l') == 'Sunday') {
$date2 = date(strtotime($date.' +2 Weekday'));
}
echo '<p>Næste levering: <span>'.$day[date("D", $date2)].'</span></p>';

Comme vous pouvez le voir dans l'exemple de code $ checkTime est l'endroit où je fixe la limite de temps qui détermine si la livraison du lendemain sera de +1 jour ouvrable ou de +2 jours ouvrés.

'1400' = 14h00 

Je sais que les déclarations if peuvent être plus compressées, mais je montre mon code pour que les gens comprennent facilement son fonctionnement.

J'espère que quelqu'un pourra utiliser ce petit extrait.

0
GeniusDesign

Voir l'exemple ci-dessous:

$startDate = new DateTime( '2013-04-01' );    //intialize start date
$endDate = new DateTime( '2013-04-30' );    //initialize end date
$holiday = array('2013-04-11','2013-04-25');  //this is assumed list of holiday
$interval = new DateInterval('P1D');    // set the interval as 1 day
$daterange = new DatePeriod($startDate, $interval ,$endDate);
foreach($daterange as $date){
if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday))
$result[] = $date->format("Y-m-d");
}
echo "<pre>";print_r($result);

Pour plus d'informations: http://goo.gl/YOsfPX

0
Suresh Kamrushi

Ce que vous devez faire c'est:

  1. Convertissez la date fournie en un horodatage.

  2. Utilisez-le avec la ou w ou N pour la commande PHP - date pour vous indiquer le jour de la semaine. 

  3. Si ce n'est pas un "jour ouvrable", vous pouvez incrémenter l'horodatage d'un jour (86 400 secondes) et vérifier à nouveau jusqu'à ce que vous atteigniez un jour ouvrable. 

NB: Pour cela, c'est vraiment travail, vous devez également exclure toute banque, tout jour férié, etc.

0
John Parker

Vous pouvez faire quelque chose comme ça. 

/**
 * @param string $date
 * @param DateTimeZone|null|null $DateTimeZone
 * @return \NavigableDate\NavigableDateInterface
 */
function getNextBusinessDay(string $date, ? DateTimeZone $DateTimeZone = null):\NavigableDate\NavigableDateInterface
{
    $Date = \NavigableDate\NavigableDateFacade::create($date, $DateTimeZone);

    $NextDay = $Date->nextDay();
    while(true)
    {
        $nextDayIndexInTheWeek = (int) $NextDay->format('N');

        // check if the day is between Monday and Friday. In DateTime class php, Monday is 1 and Friday is 5
        if ($nextDayIndexInTheWeek >= 1 && $nextDayIndexInTheWeek <= 5)
        {
            break;
        }
        $NextDay = $NextDay->nextDay();
    }

    return $NextDay;
}

$date = '2017-02-24';
$NextBussinessDay = getNextBusinessDay($date);

var_dump($NextBussinessDay->format('Y-m-d'));

Sortie:

string(10) "2017-02-27"

\NavigableDate\NavigableDateFacade::create($date, $DateTimeZone), est fourni par la bibliothèque php disponible sur https://packagist.org/packages/ishworkh/navigable-date . Vous devez d'abord inclure cette bibliothèque dans votre projet avec composeur ou téléchargement direct.

0
Ishwor Khadka