Отметка времени 1 января 1970 года превращается в -3600 - PullRequest
1 голос
/ 18 октября 2019

Когда я пытаюсь преобразовать немецкий формат даты (точнее, даты рождения) в метку времени Unix, я получаю -3600 вместо 0.

Может быть, что-то летнее?

$value = '01.01.1970';
$date = DateTime::createFromFormat ('d.m.Y', $value);
$date->setTime(0, 0);
$value = $date->getTimestamp();

echo $value; // -3600

Я всегда думал, что есть 0. Какая лучшая практика при работе с такой ситуацией? Часовой пояс GMT + 1, если это имеет значение. Я даже попытался 01.01.1850, превратив его в метку времени, а затем обратно в форматированную дату. Хорошо работает дома, но на работе это показало 31 декабря 1849 года.

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Это отличный вопрос. Тот, который даже отбросил меня, из-за этого .

Однако в вашем случае Германия была, как вы сказали по UTC + 01: 00, следовательно, в вашей системе значение $dateis 1970-01-01T00:00:00+01:00.

Если вы измените сценарий и попытаетесь выяснить, какая дата соответствует метке времени 0, это должно помочь вам понять, как часовые пояса работают с метками времени.

$date = DateTime::createFromFormat ('U', '0');
$date->setTimezone(new DateTimeZone('Europe/Berlin'));
echo $date->format(DATE_ATOM); // 1970-01-01T01:00:00+01:00

Поскольку временные метки представляют собой относительную разницу времени от эпохи UNIX в секундах, это будет другое время в другом часовом поясе. Этот подсчет начинается в полночь 1 января 1970 года в UTC. В то время как Великобритания и Германия были в UTC + 01: 00 в 1970 году, эпоха UNIX началась для них 1970-01-01 01:00:00

С точки зрения того, как лучше всего с этим справиться, ну ... это основано на мнении,Вероятно, большинство людей посоветовали бы вам иметь дело со временем в UTC, чтобы вы не сталкивались с такими странными проблемами, как эта, а только конвертировали в нужный часовой пояс на дисплее, но даже великий Джон Скит имел другое мнение ,

1 голос
/ 19 октября 2019

Подозреваю, если вы проверите с помощью date_default_timezone_get, что часовой пояс вашего сервера не установлен в UTC. Мне удалось воспроизвести это поведение следующим образом:

date_default_timezone_set('Europe/Berlin');
$value = '01.01.1970';
$date = DateTime::createFromFormat ('d.m.Y', $value);
$date->setTime(0, 0);
$value = $date->getTimestamp();

Из-за различий в часовых поясах 1970-01-01 00:00:00 в часовом поясе Берлина фактически соответствует отрицательной временной отметке Unix, равной -3600. Отметка времени Unix 0 просто соответствует 1970-01-01 00:00:00 в UTC - отрицательное значение просто указывает время до этого момента.

...