Вычитание дней из даты и времени

0

Я просто перейду к преследованию здесь. Вот мой дисфункциональный код, связанный с поиском времени начала, вычитая интервал времени окончания:

    $timeEnd = "2015-01-08T12:53:13-05:00"; //retrieved from bot crawler
    $interval = date_interval_create_from_date_string("10 days");
    $timeEndOb = new DateTime($timeEnd);
    $timeStartOb = $timeEndOb->sub($interval);
    $timeStart = $timeStartOb->format('Y-m-d H:i:s');
    echo $timeStart;
    //echoing 2015-01-08 12:53:13

Какая моя глупая проблема?

  • 1
    Каковы ваши входные и ожидаемые результаты?
  • 2
    Работает для меня
Показать ещё 10 комментариев
Теги:
datetime

2 ответа

1
Лучший ответ

Вы можете использовать clone для клонирования объекта:

$timeEnd = '2015-01-08T12:53:13-05:00';
$timeEndOb = new DateTime($timeEnd);
$timeStartOb = clone $timeEndOb;
$timeStartOb->modify('-10 days');
echo $timeStart = $timeStartOb->format('c');

demo

или вы можете использовать класс DateTimeImmutable PHP> = 5.5.0, который ведет себя так же, как DateTime за исключением того, что он никогда не изменяет себя, а возвращает вместо него новый объект:

$timeEnd = '2015-01-08T12:53:13-05:00';
$timeEndOb = new DateTimeImmutable($timeEnd);
$timeStartOb = $timeEndOb->modify('-10 days');
echo $timeStart = $timeStartOb->format('c');

demo

  • 0
    Отличные советы для этого PHP Noob. Я закончил тем, что делал что-то похожее на это, но сократил шаг клона $ timeStartOb = new DateTime ($ timeEnd)
  • 0
    @Brimby: для этого примера это должно работать идеально. Но это не сработает , если вы делаете некоторые изменения на $timeEndOb объекта перед созданием $timeStartOb , где clone клонов ток $timeEndOb экземпляра.
0

Вы можете сделать это просто с strtotime функции strtotime и функции date

$timestamp_end = strtotime("2015-01-08T12:53:13");// Note, I removed the timezone
$date_start = date('Y-m-d H:i:s', strtotime('-10 days', $timestamp_end));
$date_end = date('Y-m-d H:i:s', $timestamp_end);
echo $date_start.' to '.$date_end;

2014-12-29 12:53:13 до 2015-01-08 12:53:13

  • 0
    Почему вы удалили часовой пояс? В этом случае временная метка Unix будет недействительной (она будет действительна только в том случае, если глобальный часовой пояс будет совпадать с входным).
  • 0
    Честно говоря, не уверен, что я думал, удалив его. У меня нет причин для этого. @ Glavić Ты точно пишешь о неверных метках времени.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню