简体   繁体   中英

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?

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 (eg @946684800) or specifies a timezone (eg 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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM