2015-10-09 13 views
8

Come PHP Confronta DateTime oggetti quando si utilizza operatori condizionali (<, >, >=, <=)?PHP: confronto tra due oggetti DateTime con fusi orari diversi

Questo confronto è fuso orario invariante?

Ho provato sotto il codice e sembra che sia invariabile nel fuso orario, qualcuno può confermare?

Codice:

$datestr = "2015-10-09 10:28:01"; 
$dt = new DateTime($datestr); 
$nowdate = new DateTime("now",new DateTimeZone("CET")); 
print_r($dt); 
echo "<br/>"; 
print_r($nowdate); 
echo "<br/>"; 
var_dump($nowdate<$dt); 

uscita:

DateTime Object ([date] => 2015-10-09 10:28:01 [timezone_type] => 3 [timezone] => Europe/Paris) 
DateTime Object ([date] => 2015-10-09 10:53:42 [timezone_type] => 2 [timezone] => CET) 
boolean false 

risposta

10

Secondo the manual:

Dal PHP 5.2.2, oggetti DateTime possono essere confrontati con operatori di confronto.

Hai scelto un esempio molto confuso che include una data fissa che non è chiaro se si suppone di essere nel passato e un fuso orario che non è attualmente attivo (è CEST qui in Europa occidentale fino alla fine di ottobre). In ogni caso, non vedo nulla di sbagliato nella tua produzione: 2015-10-09 10:53:42 CET (che equivale a 2015-10-09 09:53:42 UTC) è chiaramente maggiore di 2015-10-09 10:28:01 Europe/Paris (che equivale a 2015-10-09 08:28:01 UTC).

Con un esempio un po 'meglio siamo in grado di indovinare i operandi funzionano come previsto:

echo "Same date:\n"; 
    $a = new DateTime('2015-01-31 01:23:45 UTC'); 
    $b = new DateTime('2015-01-31 02:23:45 Europe/Paris'); 
    var_dump($a, $b, $a<$b, $a==$b, $a>$b); 
    echo "\n"; 

    echo "First greater than second:\n"; 
    $a = new DateTime('2015-01-31 01:23:46 UTC'); 
    $b = new DateTime('2015-01-31 02:23:45 Europe/Paris'); 
    var_dump($a, $b, $a<$b, $a==$b, $a>$b); 
    echo "\n"; 

    echo "First less than second:\n"; 
    $a = new DateTime('2015-01-31 01:23:45 UTC'); 
    $b = new DateTime('2015-01-31 02:23:46 Europe/Paris'); 
    var_dump($a, $b, $a<$b, $a==$b, $a>$b); 
Same date: 
[...] 
bool(false) 
bool(true) 
bool(false) 

First greater than second: 
[...] 
bool(false) 
bool(false) 
bool(true) 

First less than second: 
[...] 
bool(true) 
bool(false) 
bool(false) 

Demo with full code.

Un altro esempio:

$date_2014 = new DateTime('2014-12-31 23:00:00 -07:00'); 
$date_2015 = new DateTime('2015-01-01 05:00:00 Asia/Tokyo'); 
var_dump($date_2014<$date_2015); // bool(false) 
+0

Ben spiegato. Grazie @ Álvaro G. Vicario – Yogesh

+0

trovo date molto difficili da comprendere. Ecco perché ho studiato più duramente :) –

+0

Ho due date con fuso orario diverso. E entrambe le date hanno un fuso orario fuso. E voglio la differenza tra due date in secondi o minuti o ore. –

-2

Il problema con il codice sopra è l'utilizzo di diversi tipi fuso orario.

PHP ha tre tipi di fuso orario:

  • un offset UTC, come in una nuova DateTime ("2015/02/29 -0500");

  • Un'abbreviazione del fuso orario, come nel nuovo DateTime ("2015-02-29 EST");

  • Un identificatore di fuso orario, ad esempio nel nuovo DateTime ("2015-02-29 America/Montreal");

Se si confrontano due oggetti datetime con diversi tipi di fuso orario, non si otterrà il risultato appropriato.

Nel tuo caso i fusi orari sono di tipo 2 e di tipo 3. Utilizza gli stessi tipi di fuso orario e ti darà il risultato corretto.

+0

Se gli operatori di confronto lavoro a tutti è perché qualcuno ha scritto un'implementazione specifica per gli oggetti DateTime.In tal caso, è difficile credere che abbia dimenticato due delle tre proprietà ;-) –

+0

sembra lo stesso caso per me ;-) –