2016-08-09 102 views
0

zählen Der folgende Code hilft mir, Daten aus einer Datenbank auf unserer internen Adminsite für den aktuellen Tag zu projizieren.Ich möchte "Stunden in einen Monat" in PHP

Da es sich um mehrere Zeitzonen handelt, verwenden wir die UTC-Zeit für die grundlegende Zeitfunktion, aber da unser Büro in Kalifornien liegt, möchten wir, dass das Datum tatsächlich = ($date)'hours' - 8 ist, da PST 8 Stunden zurückliegt.

Wir verwenden die folgende Logik, um den "vorherigen Tag" anzuzeigen, wenn es "einen Tag voraus" UTC-Zeit ist, aber am selben Tag unsere Zeit, die aber am letzten Tag des Monats um 16 Uhr alle gut funktioniert unserer Daten ist versteckt.

<?php 

$date = getDate(); 

if ($date['hours'] < 8) { 
    $dateDay = $date['mday']-1; 
} else { 
    $dateDay = $date['mday']; 
} 

$dateMonth = $date['mon']; 
// last day of month 
// $dateMonth = $date['mon'] - 1; 
$dateYear = $date['year']; 
$dateTime = $dateYear . "-" . $dateMonth . '-' . $dateDay . ' 08:00:00'; 

Also funktioniert diese "if" -Funktion großartig, um den wahren "Tag" zu zeigen. Was es sagt ist, wenn die UTC Stunde < 8 ist, dann ist es tatsächlich gestern, da 3 UTC UTC Zeit ist eigentlich 7 PM am Tag vor PST.

Was ich mich wunderte ist, wenn es eine Möglichkeit gibt, "Monat Stunden" zu verfolgen, also könnte ich die gleiche "Wenn" -Funktion verwenden, die lautet: "Wenn wir weniger als 8 UTC Stunden in den Monat sind, ist es eigentlich immer zuletzt Monat."

So funktioniert es unabhängig davon, ob der Monat 28, 30 oder 31 Tage hat. Gibt es eine solche Logik?

+5

Betrachten Datetime-Objekte verwenden, die sind Zeitzone und Tageslicht sparen bewusst –

+0

Verwenden Sie die DateTime-Klasse in Core-PHP geliefert. Es verfügt über alle Funktionen, die Sie jemals brauchen würden, anstatt die Dinge mit allem, was Sie gerade benutzen, zu starten – RiggsFolly

Antwort

1

Ich denke, die der beste Weg, damit umzugehen:

<?php 
    $date = new DateTime('2016-08-08', new DateTimeZone('UTC')); 
    echo $date->format('Y-m-d H:i:sP') . "\n"; 

    $date->setTimezone(new DateTimeZone('America/Los_Angeles')); 
    echo $date->format('Y-m-d H:i:sP') . "\n"; 
?> 
1

Sie können DateTime::sub oder DateTime::modify Methode verwenden, die für Sie richtigen Monat halten wird:

$now = new DateTime(getDay()); // supposing getDate() returns something that can be parsed with DateTime constructor 

// Unless using DateTimeImmutable, cloning is needed to prevent altering the original object 
$min = clone ($now); 
$min->modify('-8 hours'); 
// alternatively $min->sub(new DateInterval('PT8H')); 

if ($now->format('m') !== $min->format('m')) { 
    // month differs 
}