10
votes

Comment trouver la prochaine journée de la semaine à PHP?

Comment trouver un jour de confiance de la semaine de la semaine Spéciale en PHP Si initialement, j'ai une chaîne de date comme: 07.05.2010 ? Par exemple, je veux trouver le dimanche le plus proche (ou n'importe quel jour de la semaine). Comment puis-je mettre en œuvre cela? Merci


3 commentaires

Demandez-vous un algorithme? Si oui, pouvez-vous spécifier l'entrée / la sortie requise?


Vous trouverez peut-être cette solution intéressante: is.gd/bxrha


@nuqqsa zend_date est juste une douleur à utiliser imho


7 Réponses :


11
votes

Cela devrait faire:

echo date('d.m.Y', strtotime('next Sunday', strtotime('07.05.2010')));


6 commentaires

Pas si ce dernier est un format de date allemand mm.dd.yyyy - StrtOTIME va buendre. Vous devrez trouver une solution pour cela aussi pour obtenir mon uppote :)


De plus, assurez-vous de tester les cas de bord. Que se passe-t-il si 07.05.2010 est un dimanche?


"Dimanche prochain" n'est pas nécessairement le "dimanche le plus proche"


Demandez à vos utilisateurs de saisir la date dans le format approprié. Sinon, vous ne pouvez pas savoir si son 05/07 ou 07/05 que l'utilisateur entrait


Merci, cela a fonctionné même si la date est également un dimanche. Honte sur moi de ne pas connaître cette méthode de 'Strtotime'% de "Strtotime" ...


Donc, par le plus proche vous vouliez réellement dire suivant ?



0
votes

strtotime est magique xxx


0 commentaires

17
votes

Juste au cas où vous vouliez que le jour le plus proche em> le jour plutôt que le suivant em> un, voici un moyen de le faire.

$date = DateTime::createFromFormat("!d.m.Y", $date)
        ->modify("-4 days")->modify("next $target");


1 commentaires

Geez, je voulais surcharger des choses. Nice +1



1
votes

Il y a plusieurs réponses postées et je continue de voir des solutions qui pourraient me donner l'instance suivante d'une journée de la semaine ou de l'instance antérieure mais pas le plus proche . Pour résoudre ce problème, j'ai proposé cette fonction: xxx

entrée: un jour de la semaine ("dimanche", "lundi", etc.)

sortie: Si j'ai demandé le "dimanche" le plus proche et aujourd'hui est:

  1. "DIMANCHE": Je vais obtenir la date d'aujourd'hui
  2. "lundi": je vais avoir la date d'hier
  3. "Samedi: Je vais avoir la date de demain

    espère que cela aide :)


0 commentaires

0
votes

Ceci peut être fait en utilisant uniquement strtotime () code> et un peu de tromperie.

function findNearest($day, $date)
{
    return strtotime("next $day", strtotime("$date - 4 days"));
}

echo date('d.m.Y', findNearest("Sunday", "07.05.2010")); // 09.05.2010
echo               findNearest("Sunday", "07.05.2010");  // 1273377600
echo date('d.m.Y', findNearest("Sunday", "09.05.2010")); // 09.05.2010
echo               findNearest("Sunday", "09.05.2010");  // 1273377600
echo date('d.m.Y', findNearest("Sunday", "05.05.2010")); // 02.05.2010
echo               findNearest("Sunday", "05.05.2010");  // 1272772800


0 commentaires

0
votes

Vous pouvez utiliser la bibliothèque de carbone aussi bien

$date = Carbon::create(2015, 7, 2); // 2015-07-02

// To get the first day of the week 
$monday = $date->startOfWeek(); // 2015-06-29

$mondayTwoWeeksLater = $date->addWeek(2); // 2015-07-13


0 commentaires

3
votes
/**
 *
 * @param \DateTime $date
 * @param $dayOfWeek - e.g Monday, Tuesday ...
 */
public function findNearestDayOfWeek(\DateTime $date, $dayOfWeek)
{
    $dayOfWeek = ucfirst($dayOfWeek);
    $daysOfWeek = array(
        'Monday',
        'Tuesday',
        'Wednesday',
        'Thursday',
        'Friday',
        'Saturday',
        'Sunday',
    );
    if(!in_array($dayOfWeek, $daysOfWeek)){

        throw new \InvalidArgumentException('Invalid day of week:'.$dayOfWeek);
    }
    if($date->format('l') == $dayOfWeek){

        return $date;
    }

    $previous = clone $date;
    $previous->modify('last '.$dayOfWeek);

    $next = clone $date;
    $next->modify('next '.$dayOfWeek);

    $previousDiff = $date->diff($previous);
    $nextDiff = $date->diff($next);

    $previousDiffDays = $previousDiff->format('%a');
    $nextDiffDays = $nextDiff->format('%a');

    if($previousDiffDays < $nextDiffDays){

        return $previous;
    }

    return $next;
}
Alternatively you could create a map of what days of weeks are closer, e.g if you're after closest Monday to Wednesday, it would be faster to just find the previous Monday given that it's closer than the next Monday. 

0 commentaires