1
votes

Vérifiez l'heure entre deux heures (dans la nuit - le lendemain?)

Je dois vérifier entre des heures spécifiques pour exécuter un certain code, il doit fonctionner de 20 heures à 3 heures du matin, chaque fois que je fais une heure / vérification, cela échoue toujours dans les méthodes habituelles suggérées car je crois que nous entrons dans le lendemain matin, est-ce exact? Et si oui, comment ferais-je cela? Cela semble impossible.

c'est-à-dire

    $now = new Datetime("now");
    $begintime = new DateTime('18:00');
    $endtime = new DateTime('03:00');
    if($now >= $begintime && $now <= $endtime){
        die('x');
    }

ne s'activera pas, même si nous sommes entre ces moments?


1 commentaires

Corrigez mes excuses qui étaient une erreur dans mon écriture, mais comme il n'est pas encore 20 heures où je suis, je le teste plus tôt. - si je supprime la vérification de l'heure de fin, cela fonctionne toujours, je pense que cela a à voir avec le fait qu'il se déroule le lendemain matin.


3 Réponses :


0
votes

Essayez ! ($ now> $ endtime && $ now Qui est faussement pour le même jour entre 3h00 et 8h00 PM Ou vous pouvez supprimer Falsely ! , mais vous devez vérifier de 3h00 à 20h00 et non de 20h00 à 3h00

$now = new Datetime("now");
$begintime = new DateTime('20:00');
$endtime = new DateTime('03:00');
if(!( $now > $endtime && $now < $begintime) ){
    //This will work if Time between 8PM to 3AM
}else{
    //This will work if Time between 3AM to 8PM
}

Regardez cette démo en direct


1 commentaires

Où ça échoue? quel cas de test suivez-vous?



0
votes

Essayez ceci

$today = strtotime("today");
$yesterday = strtotime("Yesterday");
if(date("H"); >= 0 && date("H") <= 3)
{//Means we are dealing with this after midnight but still before 3AM so take yesterday as start time.
$day = date("d", $yesterday);
$month = date("m", $yesterday);
$year = date("Y", $yesterday);
$begintime = mktime(18,0,0,$month, $day, $year);
}
else
{//We are dealing with it after 3 AM so we take today's 6 PM as start time.
$day = date("d", $today);
$month = date("m", $today);
$year = date("Y", $today);
$begintime = mktime(18, 0, 0, $month, $day, $year);
//Could have taken day+1 but doesn't works at the end of the month or end of the year.
//So just add number of seconds for 9 hours
$endtime = $begintime + 32400;//

$now = time();
if($now >= $begintime && $now <= $endtime){
    die('x');
}
else {
//Run your code that you wanted to run outside this timeframe
}


2 commentaires

Lorsque vous passez au lendemain, l'heure de début` sera 18h00 ou 20h00 du jour suivant et le créneau horaire du jour suivant à partir de 00:01 < / code> à 03:00 ne fonctionnera pas. Faites un essai à sec et pensez qu'il est 1h00 ou 2h00


Veuillez vérifier la version modifiée. J'étais juste en train d'ajouter avec la résolution des problèmes de fin de mois et de fin d'année.



0
votes

L'heure a intrinsèquement besoin d'une partie de date, sinon il n'y a aucun moyen de savoir si "18:00" est aujourd'hui, hier ou dans 100 ans. Ce n'est pas une limitation de DateTime ou de toute autre implémentation, c'est ... comment le temps fonctionne. Si vous inspectez le résultat du nouveau DateTime ('18: 00 '); il aura par défaut la partie de date au jour en cours.

Si vous voulez produire cette période de manière plus fiable: p>

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2020-07-03 20:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(17) "America/Vancouver"
}
object(DateTime)#4 (3) {
  ["date"]=>
  string(26) "2020-07-04 03:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(17) "America/Vancouver"
}

Sortie:

// if you don't explicitly declare the timezone it will use the system timezone
// which is frequently not what you want.
$tz = new DateTimezone('America/Vancouver');
$begin = new DateTime('20:00', $tz);
// 7 hour interval
$span = new DateInterval('PT7H');
$end = clone $begin;
$end->add($span);

var_dump($begin, $end);


0 commentaires