В чем разница между createFromFormat('U', $date) и setTimestamp($date)?

187
27 сентября 2017, 11:37

Если мы введем такой код

date_default_timezone_set('Europe/Moscow');
echo DateTime::createFromFormat('U', strtotime('2017-09-26 12:00:00'))->format('Y-m-d H:i:s');
echo "\n" . (new DateTime)->setTimestamp(strtotime('2017-09-26 12:00:00'))->format('Y-m-d H:i:s');

То получим такой результат

2017-09-26 09:00:00
2017-09-26 12:00:00

Кто может объяснить такое поведение? И как здесь будет правильно работать с датами?

Answer 1

U - означает "количество секунд с начала Эпохи Unix (January 1 1970 00:00:00 GMT)" (см. тут)

А UNIX основное время всегда считает в UTC.

Москва - это UTC+3

Поэтому первая функция выдает тебе ответ, исходя из того, что время задано в UTC, а вторая, исходя из того, что время задано местное.

Все правильно

Answer 2

Пока писал вопрос, разобрался с ответом. Дело в том, что DateTime::createFromFormat('U', strtotime('2017-09-26 12:00:00')) это статичный метод, который не видит наш часовой пояс. А когда мы пишим (new DateTime())->setTimestamp(strtotime('2017-09-26 12:00:00')) то в конструкторе объекта (new DateTime()) часовая зона проставляется.
Для себя решил использовать такой код

DateTime::createFromFormat('U', $time)
    ->setTimeZone(new DateTimeZone(date_default_timezone_get()))
    ->format("Y-m-d H:i:s"); 
READ ALSO
Объединение периодов

Объединение периодов

Очень сложно описать задачу, которую мне нужно решить, но я постараюсь

131
Ошибка компиляции LNK1104

Ошибка компиляции LNK1104

При сборке проекта в VS 2015 происходит Ошибка LNK1104 не удается открыть файл "MSCOREElib"

339
Явное приведение типов в C++

Явное приведение типов в C++

Пытаюсь получить в ответе переменную t2 не как тип int, а как floatТ

308
Имплементация SHA-1 (ошибка результата)

Имплементация SHA-1 (ошибка результата)

Здравствуйте, я написала алгоритм SHA-1, но он не правильно вычисляет сам хеш, можете посмотреть в чем может быть проблема, я уже несколько часов...

271