Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP DateTime Format does not respect timezones?

Tags:

php

datetime

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?

like image 685
Jason Axelrod Avatar asked Aug 20 '15 05:08

Jason Axelrod


2 Answers

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

like image 109
Glavić Avatar answered Oct 19 '22 12:10

Glavić


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.

like image 27
Orangepill Avatar answered Oct 19 '22 13:10

Orangepill