PHP: лучший способ получить объект DateTimeImmutable для определенного времени
Итак, у меня есть некоторые значения времени:
$year = 2017; $month = 2; $day = 16; $hour = 7; $minute = 24; $second = 10;
Есть ли у PHP естественный способ получить объект DateTimeImmutable из этого?
Так ли это?
$datetime = new DateTime; // Create DateTime for current time
$datetime->setDate($year, $month, $day);
$datetime->setTime($hour, $minute, $second);
$datetime = DateTimeImmutable::createFromMutable($datetime);
Конструктор принимает только строку. Руководство описывает несколько форматов, но ни один из них не является датой ISO или чем-то подобным. Должен ли я выбрать один произвольно, например "WDDX" (потому что он не требует от меня заполнения значений), и отформатировать свою дату соответствующим образом?
$datetime = DateTimeImmutable($year.'-'.$month.'-'.$day.'T'.$hour.':'.$minute.':'.$second$);
Все эти способы очень обременительный. Как это обычно делается?
Edit: я просто нашел другой способ (документация не сделала это легко), который кажется совершенно правильным:
$datetime = DateTimeImmutable::createFromFormat(DateTimeImmutable::ATOM, $year.'-'.$month.'-'.$day.'T'.$hour.':'.$minute.':'.$second.'+00:00');
2 ответов:
Вы можете попробовать что-то вроде этого:
$time = (new DateTimeImmutable) ->setTime($hour, $minute, $second) ->setDate($year, $month, $day);Это немного "укороченный" вариант вашего первого примера кода
Вы можете использовать функцией mktime и DateTimeImmutable::setTimestamp
$year = 2017; $month = 2; $day = 16; $hour = 7; $minute = 24; $second = 10; $datetime = (new DateTimeImmutable()) ->setTimestamp( mktime($hour, $minute,$second, $month, $day, $year) ); var_dump($datetime);Просто очевидное замечание:
Помните, что объект DateTimeImmutable является неизменяемым :), поэтому каждый метод
setSomethingвозвращает новый экземпляр DateTimeImmutable и не изменяет исходный экземпляр.Итак
$timestamp = 12345; $datetime = new DateTimeImmutable(); $datetime->setTimestamp($timestamp); // wrong $datetime = $datetime->setTimestamp($timestamp); // right // or better $datetime = (new DateTimeImmutable())->setTimestamp($timestamp);
Comments