Если мы введем такой код
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
Кто может объяснить такое поведение? И как здесь будет правильно работать с датами?
U - означает "количество секунд с начала Эпохи Unix (January 1 1970 00:00:00 GMT)" (см. тут)
А UNIX основное время всегда считает в UTC.
Москва - это UTC+3
Поэтому первая функция выдает тебе ответ, исходя из того, что время задано в UTC, а вторая, исходя из того, что время задано местное.
Все правильно
Пока писал вопрос, разобрался с ответом.
Дело в том, что 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");
Виртуальный выделенный сервер (VDS) становится отличным выбором
При сборке проекта в VS 2015 происходит Ошибка LNK1104 не удается открыть файл "MSCOREElib"
Пытаюсь получить в ответе переменную t2 не как тип int, а как floatТ
Здравствуйте, я написала алгоритм SHA-1, но он не правильно вычисляет сам хеш, можете посмотреть в чем может быть проблема, я уже несколько часов...