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
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. –