2016-04-05 7 views
1

Я пытаюсь вычитая день и час от заданного времени даты Например:Как вычесть 1 день 16 часов из DateTime в PHP

$schedule_date_time = '2016-02-29 08:30 PM'; 
echo date("Y-m-d h:i a", strtotime("-1 day 16 hours", strtotime($schedule_date_time))); 

Это дает мне следующий результат: 2016-02-29 12:30 вечера

Что не правильно ...

Но если я это сделать:

$schedule_date_time = '2016-02-29 08:30 PM'; 
    echo date("Y-m-d h:i a", strtotime("-1 day -16 hours", strtotime($schedule_date_time))); 

Это дает мне следующий результат: 2016-02-28 4:30 утра

, который является правильным, но это не возможно для меня, чтобы определить и поставить знак минус в строке как раз перед целым числом.

+0

Преобразование дней в часы, поэтому вы можете вычесть 40 часов непосредственно. – slax0r

+3

@ slax0r не все дни 24 часа. – apokryfos

+0

Вы пробовали вычитать 40 часов вместо 1 дня, 16 часов? Кроме того, если вы не используете универсальный часовой пояс (например, UTC/GMT/Zulu), как вы предлагаете учитывать летние сбережения? – GordonM

ответ

3

date_sub/DateTime::sub.

$date = date_create("2016-02-29 08:30 PM") ; 
date_sub($date, date_interval_create_from_date_string('1 day 16 hours')); 
echo date_format($date, 'Y-m-d h:i a'); // 2016-02-28 04:30 am 

Если вы хотите добавить некоторое количество времени, а не вычитает его, используйте date_add вместо этого.

+0

Очень полезно и узнать новый код .. – AngularLearner

0

Вы можете использовать DateTime::sub метод класса наряду с DateInterval класса вроде как

$date2 = new DateTime('2016-02-29 08:30 PM'); 
$date2->sub(new DateInterval('P1DT16H')); 
echo $date2->format("Y-m-d H:i:s"); 
+0

Downvoters atleast post причина для downvoting –

2

Объект DateTime настолько силен в PHP:

$dateTimeObj = DateTime::createFromFormat('Y-m-d H:i:s', '2016-04-04 15:20:00'); 
$dateTimeObj->modify('-1 day'); 
$dateTimeObj->modify('-16 hours'); 
echo $dateTimeObj->format('Y-m-d H:i:s'); 

Это очень простой в использовании и очень ремонтопригодны для будущего кода -reviewers.

+0

Или просто $ dateTimeObj-> изменить («-40 часов»). Или вы можете использовать интервалы. – GordonM

+0

@ GordonM из-за [link] (https://en.wikipedia.org/wiki/Daylight_saving_time). 40 часов не всегда могут быть 1 день и 16 часов. – st2erw2od

Смежные вопросы