Jason Axelrod
Jason Axelrod

Reputation: 7805

PHP DateTime Format does not respect timezones?

So I have the following code:

$timezone = new DateTimeZone('America/New_York');
$datetime = new DateTime(date('r', 1440543600), $timezone);

echo $datetime->format('l, F j, Y - h:i A e');

This outputs the following:

Tuesday, August 25, 2015 - 11:00 PM +00:00

You would think it would output:

Tuesday, August 25, 2015 - 07:00 PM -04:00

How do I get format to output correctly with the set timezone?

Upvotes: 7

Views: 6460

Answers (2)

Glavić
Glavić

Reputation: 43552

Read the documentation for DateTime::__construct(), where is says for 2nd parameter:

Note: The $timezone parameter and the current timezone are ignored when the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone (e.g. 2010-01-28T15:00:00+02:00).

Based on that, set timezone on DateTime object after you have created it with unix timestamp:

$timezone = new DateTimeZone('America/New_York');
$datetime = new DateTime('@1440543600');
$datetime->setTimezone($timezone);

demo

Upvotes: 7

Orangepill
Orangepill

Reputation: 24645

I believe the issue isn't in how you are outputting your date but rather how you are inputting it. The 'r' format option includes time offset.

If you create your DateTime object with a string that is devoid of an offset you will get the expected results.

$timezone = new DateTimeZone('America/New_York');
$datetime = new DateTime("2015-08-20 01:24", $timezone);

echo $datetime->format('l, F j, Y - h:i A e');

$datetime->setTimezone(new DateTimeZone('America/Chicago'));
echo "\n";
echo $datetime->format('l, F j, Y - h:i A e');

/* outputs

Thursday, August 20, 2015 - 01:24 AM America/New_York
Thursday, August 20, 2015 - 12:24 AM America/Chicago

*/

See here for an example.

Upvotes: 1

Related Questions