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?
3 Réponses :
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
}
Où ça échoue? quel cas de test suivez-vous?
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
}
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.
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);
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.