Как правильно добавить дату и время (строку) в PHP? - PullRequest
0 голосов
/ 23 ноября 2018

Какой самый чистый способ добавить дату и строку времени в PHP?

Хотя и прочитал, что DateTime::add ожидает DateInterval, я пытался

$date = new \DateTime('17.03.2016');
$time = new \DateTime('20:20');
$result = $date->add($time);

Что было нехорошо и ничего не возвращало $result.

Чтобы сделать DateInterval из '20:20', я нашел только очень сложные решения ...

Может быть, мне следует использовать метки времени?

$date = strtotime($datestring);
$timeObj = new \DateTime($timestring);
// quirk to only get time in seconds from string date
$time = $timeObj->format('H') * 3600 + $timeObj->format('i') * 60 + $timeObj->format('s');
$datetime = $date+$time;
$result = new \DateTime;
$result->setTimestamp($datetime);

В моем случае это возвращает желаемый результат с правильным смещением часового пояса.Но как вы думаете, это надежно?Есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы хотите добавить 20 часов и 20 минут к DateTime:

$date = new \DateTime('17.03.2016');
$date->add($new \DateInterval('PT20H20M'));

Вам не нужно получать результат add(), вызывая add() для DateTimeобъект изменит это.Возвращаемое значение add() - это сам объект DateTime, поэтому вы можете связать методы.

См. DateInterval :: __ construct , чтобы узнать, как установить интервалы.

0 голосов
/ 23 ноября 2018

DateTimeDateTimeImmutable) имеет метод modify, который можно использовать для изменения времени, добавив 20 hours и 20 minutes.

Обновлено

Я включил примеры для DateTime и DateTimeImmutable в соответствии с сделанным комментарием, вам не нужно присваивать результат modify переменной, потому чтоон мутирует оригинальный объект.Принимая во внимание, что DateTimeImmutable создает новый экземпляр и не изменяет исходный объект.

DateTime

<?php

$start = new DateTimeImmutable('2018-10-23 00:00:00');
echo $start->modify('+20 hours +20 minutes')->format('Y-m-d H:i:s');

// 2018-10-23 20:20:00

Использование DateTime: https://3v4l.org/6eon8

DateTimeImmutable

<?php

$start = new DateTimeImmutable('2018-10-23 00:00:00');
$datetime = $start->modify('+20 hours +20 minutes');

var_dump($start->format('Y-m-d H:i:s'));
var_dump($datetime->format('Y-m-d H:i:s'));

Выход

string (19) «2018-10-23 00:00:00»

string (19) «2018-10-23 20:20:00»

Использование DateTimeImmutable: https://3v4l.org/oRehh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...