Wenn Sie ein $start_date
und haben $end_date
, wie können Sie überprüfen, ob ein vom Benutzer angegebenes Datum in diesen Bereich fällt?
z.B
$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';
Im Moment sind die Daten Zeichenfolgen. Würde es helfen, sie in Zeitstempel-Ganzzahlen umzuwandeln?
php
date
date-range
meleyal
quelle
quelle
Antworten:
Das Konvertieren in Zeitstempel ist der richtige Weg, wenn Sie strtotime verwenden , z
quelle
Es ist nicht erforderlich, für den Vergleich in einen Zeitstempel zu konvertieren, da die Zeichenfolgen als Daten im kanonischen Format 'JJJJ-MM-TT' validiert werden.
Dieser Test wird funktionieren:
gegeben:
HINWEIS: Der Vergleich solcher Zeichenfolgen ermöglicht "ungültige" Daten, z. B. (32. Dezember) '2009-13-32', und seltsam formatierte Zeichenfolgen '2009/3/3', sodass ein Zeichenfolgenvergleich NICHT gleichwertig ist ein Datums- oder Zeitstempelvergleich. Dies funktioniert NUR, wenn die Datumswerte in den Zeichenfolgen in einem konsistenten und kanonischen Format vorliegen.
BEARBEITEN Sie , um hier eine Notiz hinzuzufügen und das Offensichtliche zu erläutern.
Mit KONSISTENT meine ich zum Beispiel, dass die verglichenen Zeichenfolgen das gleiche Format haben müssen: Der Monat muss immer aus zwei Zeichen bestehen, der Tag muss immer aus zwei Zeichen bestehen und das Trennzeichen muss immer ein Bindestrich sein. Wir können "Zeichenfolgen", die nicht aus vier Zeichenjahr, zwei Zeichenmonaten und zwei Zeichen bestehen, nicht zuverlässig vergleichen. Wenn wir zum Beispiel eine Mischung aus einem Zeichen und zwei Zeichenmonaten in den Zeichenfolgen hätten, würden wir im Vergleich
'2009-9-30'
zu ein unerwartetes Ergebnis erzielen'2009-10-11'
. Wir sehen menschlich "9" als kleiner als "10", aber ein Zeichenfolgenvergleich wird'2009-9'
als größer als "'2009-1'
. Wir brauchen nicht unbedingt ein Bindestrich-Trennzeichen. Wir könnten genauso gut Strings in vergleichen'YYYYMMDD'
Format; Wenn es ein Trennzeichen gibt, muss es immer da und immer gleich sein.Mit CANONICAL meine ich ein Format, das zu Zeichenfolgen führt, die in Datumsreihenfolge sortiert werden. Das heißt, die Zeichenfolge wird zuerst "Jahr", dann "Monat" und dann "Tag" darstellen. Wir können Zeichenfolgen im
'MM-DD-YYYY'
Format nicht zuverlässig vergleichen , da dies nicht kanonisch ist. Ein Zeichenfolgenvergleich würde denMM
(Monat) vor dem VergleichYYYY
(Jahr) vergleichen, da der Zeichenfolgenvergleich von links nach rechts funktioniert.) Ein großer Vorteil des Zeichenfolgenformats 'JJJJ-MM-TT' besteht darin, dass es kanonisch ist. In diesem Format dargestellte Daten können zuverlässig als Zeichenfolgen verglichen werden.[NACHTRAG]
Wenn Sie sich für die PHP-Zeitstempelkonvertierung entscheiden, beachten Sie die Einschränkungen.
Auf einigen Plattformen unterstützt PHP keine Zeitstempelwerte früher als 1970-01-01 und / oder später als 2038-01-19. (Das ist die Natur der 32-Bit-Ganzzahl des Unix-Zeitstempels.) Spätere Versionen von PHP (5.3?) Soll dies beheben.
Die Zeitzone kann auch ein Problem sein, wenn Sie beim Konvertieren von Zeichenfolge zu Zeitstempel und von Zeitstempel zurück zu Zeichenfolge nicht darauf achten, dieselbe Zeitzone zu verwenden.
HTH
quelle
Verwenden Sie die DateTime-Klasse, wenn Sie über PHP 5.3+ verfügen. Einfacher zu bedienen, bessere Funktionalität.
DateTime unterstützt intern Zeitzonen. Die anderen Lösungen liegen bei Ihnen.
quelle
2012-02-01
dazwischen liegt2012-02-01 ... 2014-04-30 23:59:59
.DateTime
immer die skizzenhaften Zeitfunktionen, die PHP sofort bietet. Um das Start- und Enddatum in diese Prüfungreturn $date >= $startDate && $date <= $endDate;
quelle
Konvertieren Sie dann beide Daten in Zeitstempel
Pseudocode:
quelle
Unter der Annahme, dass der Benutzer intelligent genug ist, um Ihnen gültige Daten zu geben, müssen Sie in dem von Ihnen angegebenen Format nicht zuerst in ein Datum konvertieren, sondern können sie als Zeichenfolgen vergleichen.
quelle
quelle
Konvertieren Sie sie in Datums- oder Zeitstempel-Ganzzahlen und überprüfen Sie dann, ob $ date_from_user <= $ end_date und> = $ start_date ist
quelle
Sie können dies versuchen:
quelle
iterator_to_array()
ist verfügbar seit PHP 5.1Ich fand diese Methode am einfachsten:
quelle