У меня небольшая проблема с вычитанием дат в PHP, вот один из многих кодов, которые я пробовал:
date_default_timezone_set('Europe/Paris');
$log_end = new DateTime(); // date from which I want to substract a period
$log_begin = $log_end->sub(new DateInterval('PT0H1M2S')); //I substract the period to the date to find the when the log begins.
$log_b = $log_begin->format("Y-m-d H:i:s");
$log_e = $log_end->format("Y-m-d H:i:s");
print_r($log_b);
print_r("\n");
print_r($log_e);
Вот что напечатано:
2014-12-03 21:50:41
2014-12-03 21:50:41
Как видите, даты одинаковы, какими бы методами я ни пользовался, результат был одинаковым.
Так я где-то допустил ошибку или что я хочу сделать невозможно?
Заранее спасибо, что нашли время помочь мне и ответить мне, дайте мне знать, если вам нужна информация.
$log_begin = $log_end->sub(new DateInterval('PT0H1M2S'));
Вычитает интервал даты из $log_end
(так $log_end
сейчас 2014-12-03 21:50:41
) а также возвращает новый объект DateTime с тем же (2014-12-03 21:50:41
) значение, которое хранится в $ log_begin
Предотвращать $log_end
от настройки, клонировать его в $log_begin
а затем вычесть период из $log_begin
date_default_timezone_set('Europe/Paris');
$log_end = new DateTime(); // date from which I want to substract a period
$log_begin = clone $log_end;
$log_begin->sub(new DateInterval('PT0H1M2S')); //I substract the period to the date to find the when the log begins.
$log_b = $log_begin->format("Y-m-d H:i:s");
$log_e = $log_end->format("Y-m-d H:i:s");
print_r($log_b);
print_r("\n");
print_r($log_e);
Однажды я создал класс PHP для обработки дат, например, вычитание или добавление дней (и / или месяцев, и / или лет). Это то, что вам нужно? Проверь это:
class Dates
{
public function __construct() {}
public function add_date($_date, $_years, $_months, $_days, $_spacer, $_leading_zeros = 1) {
$values = explode($_spacer, $_date);
for($i = 0;$i < 3;$i++) {$values[$i] = round($values[$i]);}
$values[2] += $_days;
if($values[2] > 31) {
$aux = floor($values[2] / 31);
while($values[2] > 31) {$values[2] -= 31;}
$values[1] += $aux;
}
$values[1] += $_months;
$values[0] += $_years;
if($values[1] > 12) {
$aux = floor($values[1] / 12);
while($values[1] > 12) {$values[1] -= 12;}
$values[0] += $aux;
}
$leapYear = (($values[0] % 4 == 0) && (($values[0] % 100 != 0) || ($values[0] % 400 == 0))) ? 29 : 28;
$days = Array(0, 31, $leapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if($values[2] > $days[$values[1]]) {
$values[2] -= $days[$values[1]];
$values[1]++;
}
if($_leading_zeros) {return leading_zeros($values[0].$_spacer.$values[1].$_spacer.$values[2], $_spacer);}
else {return $values[0].$_spacer.$values[1].$_spacer.$values[2];}
}
public function subtract_date($_date, $_years, $_months, $_days, $_spacer, $_leading_zeros = 1) {
$values=explode($_spacer, $_date);
for($i = 0;$i < 3;$i++){$values[$i] = round($values[$i]);}
$days = Array(0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$values[0] -= $_years;
$values[1] -= $_months;
while($values[1] < 1) {
$values[1] += 12;
$values[0]--;
}
$values[2] -= $_days;
while($values[2] < 1) {
$values[1]--;
if($values[1] == 0) {
$values[1] = 12;
$values[0]--;
}
if($values[1] == 2) {$days[2] = (($values[0] % 4 == 0) && (($values[0] % 100 != 0) || ($values[0] % 400 == 0))) ? 29 : 28;}
$values[2] += $days[$values[1]];
}
if($_leading_zeros) {return leading_zeros($values[0].$_spacer.$values[1].$_spacer.$values[2], $_spacer);}
else {return $values[0].$_spacer.$values[1].$_spacer.$values[2];}
}
public function leading_zeros($_date, $_spacer) {
$_date = $_spacer.$_date.$_spacer;
for($i = 1;$i < 10;$i++) {
while(strstr($_date, $_spacer.$i.$_spacer)){$_date = str_replace($_spacer.$i.$_spacer, $_spacer.'0'.$i.$_spacer, $_date);}
}
$_date = substr($_date, 1);
$_date = substr($_date, 0, -1);
return $_date;
}
}