theking2
theking2

Reputation: 2838

Correct epoch to DateTime conversion

Whit this code:

$epoch=  '1609455600';
$date = new DateTime( '@'.$epoch);
echo $date-> format( 'Y-m-d');

I see this result 2020-12-31. The server timezone is reported as Europe/Zurich (with date_default_timezone_get). But in this time zone that date should be 2021-1-1.

What is going on here?

Upvotes: 0

Views: 621

Answers (1)

jspit
jspit

Reputation: 7703

In addition to the comment from @tuckbros. The output with var_export shows that the DateTime object has the time zone 00:00 (UTC).

date_default_timezone_set('Europe/Zurich');
$epoch=  '1609455600';

$date = new DateTime( '@'.$epoch);

var_export($date);
/*
DateTime::__set_state(array(
   'date' => '2020-12-31 23:00:00.000000',
   'timezone_type' => 1,
   'timezone' => '+00:00',
)) 
*/

The clean way to get the local time is to transfer the object to the desired time zone (and not to add any offset times).

$date->setTimeZone(new DateTimeZone(date_default_timezone_get()));
var_export($date);
/*
DateTime::__set_state(array(
   'date' => '2021-01-01 00:00:00.000000',
   'timezone_type' => 3,
   'timezone' => 'Europe/Zurich',
)) 
*/

You can now continue to work with the DateTime object, since it has the correct time zone in addition to the correct local time.

Upvotes: 1

Related Questions