PHP DateTime Timezones - método Construtor vs Setter

Ao usar o PHPDateTime classe e tente definir umDateTimeZone Eu obtenho resultados diferentes dependendo de como eu o defino: usando oDateTime::__construct ou usando oDateTime::setTimezone método.

aqui está um exemplo:

$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

Veja tambémhttp://3v4l.org/LrZfM

Eu olhei em volta e não encontrei uma explicação adequada que abordasse esse comportamento específico, além do comentário a seguir nodocs php: datetime.settimezone e o livroGuia do arquiteto para programação de data e hora: lidando com fusos horários - DateTimeZone.

O comentário afirma que oDateTime::setTimezone O método alterará o fuso horário para um ponto específico no tempo (um registro de data e hora), mas o registro de data e hora do Unix permanece inalterado.

Por outro lado, oDateTime::__construct O parâmetro DateTimeZone é usado para "substituir o fuso horário padrão atual por um definido pelo usuário"Capítulo 3: Lidando com fusos horários - DateTimeZone.

Fora isso, não há muito sobre o assunto (que eu consegui encontrar).

Isto é o que eu gostaria de saber:

Mais explicações sobre essas duas maneiras de definir os fusos horáriosQuando devo usar oDateTime::__construct definir o fuso horárioQuando devo usar oDateTime::setTimezone definir o fuso horárioUm exemplo claro de como usar um vs o outro ou como usá-los em conjunto

questionAnswers(1)

yourAnswerToTheQuestion