2014-09-04 11 views
5

Quando si utilizza la classe PHP DateTime e cercare di impostare un DateTimeZone ottengo risultati diversi a seconda di come ho impostato: utilizzando il DateTime::__construct sia utilizzando il metodo DateTime::setTimezone.PHP DateTime Timezones - Funzione di costruzione vs metodo setter

Ecco un esempio:

$date = '2014-08-01' 

$dateTimeOne = new DateTime($date, new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeOne->format('Y-m-d\TH:i:sP'); 
// 2014-08-01T00:00:00-07:00 

$dateTimeTwo = new DateTime($date); 
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeTwo->format('Y-m-d\TH:i:sP'); 
// 2014-07-31T17:00:00-07:00 

Vedi anche http://3v4l.org/LrZfM

Ho guardato in giro e non ho trovato una spiegazione adeguata che affronta queste particolari comportamento diverso da quello seguente commento nel php docs: datetime.settimezone e il libro php|architect's Guide to Date and Time Programming: Dealing with Timezones - DateTimeZone.

Il commento indica che il metodo DateTime::setTimezone cambierà il fuso orario per un determinato punto nel tempo (un timestamp) ma il timestamp Unix rimane invariato.

D'altra parte il parametro DateTime::__construct DateTimeZone viene utilizzato per "sovrascrivere il fuso orario predefinito corrente con un utente definito" Chapter 3: Dealing with Timezones - DateTimeZone.

Oltre a questi non c'è molto sull'argomento (che sono riuscito a trovare).

questo è quello che vorrei sapere:

  • ulteriore spiegazione di questi due modi per impostare i fusi orari
  • Quando devo utilizzare il DateTime::__construct per impostare il fuso orario
  • Quando devo usare il DateTime::setTimezone per impostare il fuso orario
  • un chiaro esempio utilizzando uno contro l'altro o come utilizzarli in combinazione
+2

Avere un fuso orario nel costruttore significa che '$ date' è in quel fuso orario; l'impostazione di un fuso orario sposta la data in base alla differenza tra il fuso orario in costruzione e quello specificato. –

risposta

1

Questo è un comportamento normale.

Quando non si specifica il fuso orario nel costruttore, viene utilizzato il fuso orario predefinito, vale a dire ciò che è stato impostato utilizzando date_default_timezone_set().

Quando si quindi chiamare:

$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 

Si sposta la data fissata nel fuso orario di default nel nuovo fuso orario.


1) (costruttore) data fissata in 'America/Los_Angeles'
2) (setter) data fissata nel fuso orario predefinito, data di passaggio al 'America/Los_Angeles'


tuo predefinito il fuso orario era probabilmente UTC o qualcosa di simile. Hai detto al computer di impostare 2014-08-01 a UTC. Hai quindi chiesto di passare al fuso orario 'America/Los_Angeles', che è 7 ore prima, quindi modificando la data 2014-07-31 alle 17:00.