2016-11-07 1 views
-1

ich eine Schleife haben, die Wochenendtage zählt, funktioniert es wie folgt aus:Datum hält einen Zeitstempel aus der Zukunft als ein Datum aus der Vergangenheit

$weekends = 0; 
while ($begin <= $today) { 
    $no_days++; 
    $what_day = date("N", $begin); 
    if ($what_day > 5) { 
     $weekends++; 
    }; 
    $begin += 86400; 
}; 

$ beginnen am ersten Tag des Monats ist, und heute $ heute ist und ich sie wie diese:

$begin = date("Y-m-01"); 
$today = date("Y-m-d"); 

$ beginnen und heute $ sind richtig, aber aus irgendeinem Grund meine Schleife sagt, dass drei aufeinander folgende Tage Wochenende sind. Ich druckte te Wert von $ beginnt an der Innenseite des, wenn Gründe für debuggin und ich erhalte die folgende Ausgabe:

2016-11-05 12:11:00 (1478329200)

2016-11-06 12 : 11: 00 (1478415600)

2016-11-06 11:11:00 (1478502000)

Statt dessen, was ich bekommen erwarten ist:

2016-11-05 12:11:00 (1478329200)

2016-11-06 12:11:00 (1478415600)

2016-11-07 12:11:00 (1478502000)

Dieses Skript funktioniert seit mehreren Monaten gut, aber heute funktioniert nicht mehr. Ich habe eine date_default_timezone_set('America/Los_Angeles'); am Anfang.

Ich verstehe nicht ganz, wie Daten funktionieren, also bin ich nicht wirklich sicher, wie ich anfangen soll, nach dem Problem zu suchen, also wenn es ein Zeitzonenproblem ist und jemand mich auf eine Informationsquelle hinweisen möchte zu diesem Thema zu lernen werde ich wirklich glücklich sein :)

EDIT: Wie @Devon darauf hinweist. Ich habe $end für $today geändert, um Missverständnisse zu vermeiden.

+2

Lustig, wie dies während der Sommerzeit passiert .... –

+0

Dank @JohnConde, "Sommerzeit" bekomme mich zur Antwort;) !. Ich werde die Frage hier stellen, bis ich genug gelesen habe, um eine gute Antwort zu geben, oder jemand schreibt eine gute Antwort dafür. – lcjury

+2

Es gibt eine Reihe von Kopfschmerzen, die Sie bekommen können, indem Sie einfach annehmen, dass "morgen" "heute plus 86400 Sekunden" ist. Betrachten Sie einen anderen Weg, um von einem Tag zum nächsten zu kommen. –

Antwort

1

Sie sollten in Betracht ziehen, mit den Klassen DateTime, DateInterval und DatePeriod von PHP zu arbeiten.

function countWeekendDaysBetweenDateTimes(DateTime $start, DateTime $end) { 
    $weekend_count = 0; 
    // one day interval 
    $interval = new DateInterval('P1D'); 
    // get date period object based on start, end, interval 
    $date_period = new DatePeriod($start, $interval, $end); 
    foreach($date_period as $dt) { 
     if ((int)$dt->format('N') > 5) { 
      $weekend_count++; 
     } 
    } 
    return $weekend_count; 
} 

Diese Klassen werden sehr viel zuverlässiger sein, mit zu arbeiten, wenn sie mit Bereichen und Rezidive von Terminen zu tun und werden in der Regel vereinfachen auch mit Zeitzonen (DateTimeZone), Sommer tun hat, Schaltjahre und andere Anomalien unseres Kalenders und Zeitsysteme.

+0

Dank @mike funktioniert das wie erwartet !, nur für Lernzwecke. Es wird empfohlen Um ein Casting der vom Format zurückgegebenen Zeichenkette durchzuführen, um sie mit einer Zeichenkette zu vergleichen ?, warum? – lcjury

+1

@Icjury '5' ist ein ganzzahliger Wert, den ich zum Vergleich verwende (wie in Ihrem Beispiel) Ich möchte die Ausgabe von 'format()' in eine Ganzzahl für ähnliche Vergleichszwecke umwandeln. Natürlich möchte ich zwei Elemente so explizit wie möglich vergleichen - zum Beispiel fast ein Verwenden Sie strikte Vergleiche ('===', '! ===') vs. losen Vergleich ('==', '! ='). Da der Rückgabewert von 'format ('N')' in diesem Fall so vorhersehbar ist, ist es nicht wirklich wichtig. –

Verwandte Themen