2016-03-25 2 views
3

Ich habe 3 Variablen für einen Tag und die Uhrzeit der in einem Array gespeichert Woche:hat diesen Tag und die Zeit in dieser Woche erfolgreich war oder nicht - PHP

$shift['day']; 
$shift['hour']; 
$shift['meridian']; 

Alle 3 zusammen bzw. Ausgang so etwas wie:

DATE wird nicht verwendet, nur DAY und TIME und es ist offensichtlich nicht als Zeitstempel gespeichert.

Wie kann ich überprüfen, ob dieser TAG und diese ZEIT diese Woche schon vergangen sind?

So zum Beispiel:

$today = date("l"); // Get current day "Monday" 
$hour = date("g"); // Get current hour "3" 
$meridian = date("A"); // Get current meridian "PM" 

Wird mir die aktuellen Werte bekommen bereit, meine Variablen zu vergleichen, aber ich bin verloren, wie die Logik funktionieren würde meine Zeit, um festzustellen, ob bereits in dieser Woche verstrichen ist oder nicht ?

Jede Hilfe sehr geschätzt.

+0

Sie sind besser dran mit Javascript dafür. PHP läuft nur auf dem Server. Da dies überall auf der Welt möglich ist, müssen Sie Anpassungen für Zeitzonen vornehmen. Was ist nur eine andere Dose Würmer. – durbnpoisn

+0

Ruft den numerischen Wert des Tages ab. 'N'. Wahrscheinlich besser dran mit 24-Stunden-Uhr als "Meridian". – chris85

+0

@durbnpoisn Nein, es ist in Ordnung, ich kann dies mit PHP tun, da die Ausgabe strikt serverbezogen ist (nicht Benutzer/Browser/Zeitzone). Ich muss nur die Logik kennen. – Grant

Antwort

1

Sie können die date Funktionen verwenden, um die Werte auf ganze Zahlen herunterzufahren, dann verwenden Sie einfach eine Bedingung.

$shift['day'] = 'Friday'; 
$shift['meridian'] = 'PM'; 
$hour = '10'; 
$shift['hour'] = ($shift['meridian'] == 'PM') ? $hour + 12 : $hour; //convert input to 24 hour 
$today = date("N"); 
$current_hour = date("G"); 
if(date('N', strtotime($shift['day'])) <= $today && $current_hour <= $shift['hour']) { 
    echo 'It hasn\'t occurred yet this week'; 
} else { 
    echo 'It has occurreced this week'; 
} 

... oder als eine Auskleidung (unter der Annahme $shift['hour'] 24 Stunden):

if(date('N', strtotime($shift['day'])) <= date("N") && date("G") <= $shift['hour']) { 

Demo: https://eval.in/542298

Stellen Sie sicher, dass die Zeitzone richtig anders gesetzt haben, wo Mitternacht konnte fällt Wirf den Tag ab.

+0

Das ist perfekt, danke Mann;) – Grant

2

Logic:

  • erstellen DateTime Objekt für jetzt
  • erstellen DateTime Objekt für Friday 10 PM.
  • Vergleichen sie durch Zeitstempel, welche größer

-Code zu sehen:

$tz = new \DateTimeZone("UTC"); 
$now = new \DateTime("now", $tz); 
$then = \DateTime::createFromFormat('l g A', 'Friday 10 PM', $tz); 

if($then->getTimestamp() < $now->getTimestamp()) 
{ 
    echo 'Friday 10 PM has passed this week'; 
} 
else 
{ 
    echo 'No, Friday 10 PM has not passed this week'; 
} 

Hallend $then->format('d.m.Y, H:i:s') Ausbeuten 25.03.2016, 22:00:00. Das Ändern des Tages von "Freitag" auf "Samstag" ergibt korrekt den 26. März, und ich habe festgestellt, dass das Objekt DateTime für die angegebene Zeichenfolge (Friday 10 PM) korrekt erstellt wurde.

+0

Eigentlich nach dem Spielen mit den anderen Antworten hier, erweist sich dieser als der einzige, der am zuverlässigsten ist. Die DateTime-API ist etwas, das ich vorher noch nicht benutzt habe, aber ich werde es für alles verwenden, was mit dem Datum zu tun hat. Vielen Dank Mjh, das ist fantastisch! – Grant

+0

Ich bin froh, dass Sie es nützlich fanden, viel Glück mit Ihrem Projekt und einen schönen Tag! :) – Mjh

2

Die DateTime Klasse eine Menge von Werkzeugen bietet dabei dies zu helfen, und another answer bereits nutzt es, aber es ist größte Vorteil bei weitem ist, dass es tatsächlich ermöglicht, mit Daten in einem rein menschlichen Weg zur Arbeit - Sie don Füttere es nicht mit erfundenen Zahlen, die mathematischen Sinn ergeben!

Also hier ist eine Möglichkeit, das zu tun ...

Natürlich müssen wir die Zeitstempel erstellen zuerst vergleichen:

// With no arguments, this is just the current timestamp 
$now = DateTime(); 

// Tricky part here is to know that any omitted *calendar-type* values 
// default to the current day, while *time* values default to 0s 
$shift = DateTime::createFromFormat(
    'l g A', 
    "{$shift['day']} {$shift['hour']} {$shift['meridian']}" 
); 

Aber was ist hart (zumindest zu der Zeit ich dies schreibe) zu beschmutzen in dem PHP-Handbuch für DateTime Klasse sind die DateTime::diff() method, die tatsächlich nur auf dem Inhaltsverzeichnis für DateTimeInterface angezeigt wird.
Sobald Sie, dass Sie müssen nur wissen, dass + und - Zeichen „Zukunft“ und „Vergangenheit“ bedeuten:

if ($now->diff($shift)->format('%R') === '-') 
{ 
    // $shift is in the past; i.e. Friday 10 PM has passed 
} 

Natürlich kann man die gleiche Sache über date(), strtotime() und Mathematik replizieren , aber das ist viel expressiver und leicht verständlich.

+0

Das ist super glatt! ;) – Grant

Verwandte Themen