Php разница часов между датами

Рассчитать количество часов между двумя датами в PHP

Новые версии PHP-версии предоставляют несколько новых классов, называемых DateTime , DateInterval , DateTimeZone и DatePeriod . Классная вещь в этом классе заключается в том, что он рассматривает разные временные интервалы, високосные годы, прыжки секунд, летнее время и т. Д. И вдобавок к этому он очень прост в использовании. Вот что вы хотите с помощью этих объектов:

// Create two new DateTime-objects. $date1 = new DateTime('2006-04-12T12:30:00'); $date2 = new DateTime('2006-04-14T11:30:00'); // The diff-methods returns a new DateInterval-object. $diff = $date2->diff($date1); // Call the format method on the DateInterval-object echo $diff->format('%a Day and %h hours'); 

Возвращаемый объект DateInterval также предоставляет другие методы, кроме format . Если вы хотите получить результат только в часах, вы можете сделать что-то вроде этого:

$date1 = new DateTime('2006-04-12T12:30:00'); $date2 = new DateTime('2006-04-14T11:30:00'); $diff = $date2->diff($date1); $hours = $diff->h; $hours = $hours + ($diff->days*24); echo $hours; 

И вот ссылки для документации:

Все эти классы также предлагают процедурный / функциональный способ работы с датами. Поэтому взгляните на обзор: http://php.net/manual/book.datetime.php

$t1 = StrToTime ( '2006-04-14 11:30:00' ); $t2 = StrToTime ( '2006-04-12 12:30:00' ); $diff = $t1 - $t2; $hours = $diff / ( 60 * 60 ); 

Самый простой способ получить правильное количество часов между двумя датами (datetimes), даже при изменении летнего времени, – использовать разницу в отметках времени Unix. Временные метки Unix – это секунды, прошедшие с 1970-01-01T00: 00: 00 UTC, игнорируя секунды прыжка (это нормально, потому что вам, вероятно, не нужна эта точность, и из-за того, что во время прыжка довольно сложно).

Читайте также:  Typescript find object in array

Самый гибкий способ конвертировать строку datetime с дополнительной информацией о часовом поясе в временную метку Unix – это построить объект DateTime (необязательно с DateTimeZone в качестве второго аргумента в конструкторе), а затем вызвать его метод getTimestamp .

$str1 = '2006-04-12 12:30:00'; $str2 = '2006-04-14 11:30:00'; $tz1 = new DateTimeZone('Pacific/Apia'); $tz2 = $tz1; $d1 = new DateTime($str1, $tz1); // tz is optional, $d2 = new DateTime($str2, $tz2); // and ignored if str contains tz offset $delta_h = ($d2->getTimestamp() - $d1->getTimestamp()) / 3600; if ($rounded_result) < $delta_h = round ($delta_h); >else if ($truncated_result) < $delta_h = intval($delta_h); >echo "Δh: $delta_h\n"; 

Предоставить другой метод DatePeriod .

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

$date1 = new \DateTime('2006-04-12T12:30:00'); $date2 = new \DateTime('2006-04-14T11:30:00'); //determine what interval should be used - can change to weeks, months, etc $interval = new \DateInterval('PT1H'); //create periods every hour between the two dates $periods = new \DatePeriod($date1, $interval, $date2); //count the number of objects within the periods $hours = iterator_count($periods); echo $hours . ' hours'; 

Подсчет часов с летней экономией (например: https://3v4l.org/eO9KE )

//set timezone to UTC to disregard daylight savings ini_set('date.timezone', 'America/New_York'); $date1 = new \DateTime('2006-01-01T12:00:00'); $date2 = new \DateTime('2006-06-01T12:00:00'); $interval = new \DateInterval('PT1H'); $periods = new \DatePeriod($date1, $interval, $date2); $hours = iterator_count($periods); echo $hours . ' hours'; 

Тот же метод может использоваться для определения периодов оплаты и поиска дат вместо их подсчета.

$interval = new \DateInterval('P2W'); $payPeriodStart = new \DateTime('2012-08-12T00:00:00'); $today = new \DateTime('2016-03-04T12:00:00'); $today->add($interval); $payPeriods = new \DatePeriod($payPeriodStart, $interval, $today); $payPeriods = array_reverse(iterator_to_array($payPeriods)); $recent = [ 'current' => [ 'start' => $payPeriods[1]->format('Ym-d'), 'end' => $payPeriods[0]->format('Ym-d') ], 'previous' => [ 'start' => $payPeriods[2]->format('Ym-d'), 'end' => $payPeriods[1]->format('Ym-d') ] ]; var_dump($recent); 
array(2) < ["current"]=>array(2) < ["start"]=>string(10) "2016-02-21" ["end"]=> string(10) "2016-03-06" > ["previous"]=> array(2) < ["start"]=>string(10) "2016-02-07" ["end"]=> string(10) "2016-02-21" > > 
//Calculate number of hours between pass and now $dayinpass = "2013-06-23 05:09:12"; $today = time(); $dayinpass= strtotime($dayinpass); echo round(abs($today-$dayinpass)/60/60); 
$day1 = "2006-04-12 12:30:00" $day1 = strtotime($day1); $day2 = "2006-04-14 11:30:00" $day2 = strtotime($day2); $diffHours = round(($day2 - $day1) / 3600); 

Я предполагаю, что функция strtotime () принимает этот формат даты.

К сожалению, решение, предоставленное FaileN, не работает, как заявил Уолтер Тросс .. дни могут быть не 24 часа!

Мне нравится использовать PHP-объекты, где это возможно, и для большей гибкости я придумал следующую функцию:

/** * @param DateTimeInterface $a * @param DateTimeInterface $b * @param bool $absolute Should the interval be forced to be positive? * @param string $cap The greatest time unit to allow * * @return DateInterval The difference as a time only interval */ function time_diff(DateTimeInterface $a, DateTimeInterface $b, $absolute=false, $cap='H')< // Get unix timestamps, note getTimeStamp() is limited $b_raw = intval($b->format("U")); $a_raw = intval($a->format("U")); // Initial Interval properties $h = 0; $m = 0; $invert = 0; // Is interval negative? if(!$absolute && $b_raw <$a_raw)< $invert = 1; >// Working diff, reduced as larger time units are calculated $working = abs($b_raw-$a_raw); // If capped at hours, calc and remove hours, cap at minutes if($cap == 'H') < $h = intval($working/3600); $working -= $h * 3600; $cap = 'M'; >// If capped at minutes, calc and remove minutes if($cap == 'M') < $m = intval($working/60); $working -= $m * 60; >// Seconds remain $s = $working; // Build interval and invert if necessary $interval = new DateInterval('PT'.$h.'H'.$m.'M'.$s.'S'); $interval->invert=$invert; return $interval; > 

Это подобно date_diff() создает DateTimeInterval , но с наивысшей единицей как часы, а не годами .. он может быть отформатирован как обычно.

$interval = time_diff($date_a, $date_b); echo $interval->format('%r%H'); // For hours (with sign) 

NB Я использовал format(‘U’) вместо getTimestamp() из-за комментария в руководстве . Также обратите внимание, что 64-бит требуется для дат после эпохи и до отрицательных эпох!

Эта функция поможет вам рассчитать точные годы и месяцы между двумя заданными датами, $doj1 и $doj . Он возвращает пример 4.3 означает 4 года и 3 месяца.

$mm) < $mn=$mm1-$mm; if($dd1<$dd) < $mn=$mn-1; >$ye=$yy1-$yy; > else if($mm1 <$mm) < $mn=12-$mm; //$mn=$mn; if($mm!=1) < $mn1=$mm1-1; >$mn+=$mn1; if($dd1>$dd) < $mn+=1; >$yy=$yy+1; $ye=$yy1-$yy; > else < $ye=$yy1-$yy; $ye=$ye-1; $mn=12-1; if($dd1>$dd) < $ye+=1; $mn=0; >> $to=$ye." year and ".$mn." months"; return $ye.".".$mn; /*return daysDiff($x[2],$x[0],$x[1]); $days=dateDiff("/",$now,$doj)/$year_diff; $days_exp=explode(".",$days); return $years_exp=$days; //number of years exp*/ > ?> в $mm) < $mn=$mm1-$mm; if($dd1<$dd) < $mn=$mn-1; >$ye=$yy1-$yy; > else if($mm1 <$mm) < $mn=12-$mm; //$mn=$mn; if($mm!=1) < $mn1=$mm1-1; >$mn+=$mn1; if($dd1>$dd) < $mn+=1; >$yy=$yy+1; $ye=$yy1-$yy; > else < $ye=$yy1-$yy; $ye=$ye-1; $mn=12-1; if($dd1>$dd) < $ye+=1; $mn=0; >> $to=$ye." year and ".$mn." months"; return $ye.".".$mn; /*return daysDiff($x[2],$x[0],$x[1]); $days=dateDiff("/",$now,$doj)/$year_diff; $days_exp=explode(".",$days); return $years_exp=$days; //number of years exp*/ > ?> в $mm) < $mn=$mm1-$mm; if($dd1<$dd) < $mn=$mn-1; >$ye=$yy1-$yy; > else if($mm1 <$mm) < $mn=12-$mm; //$mn=$mn; if($mm!=1) < $mn1=$mm1-1; >$mn+=$mn1; if($dd1>$dd) < $mn+=1; >$yy=$yy+1; $ye=$yy1-$yy; > else < $ye=$yy1-$yy; $ye=$ye-1; $mn=12-1; if($dd1>$dd) < $ye+=1; $mn=0; >> $to=$ye." year and ".$mn." months"; return $ye.".".$mn; /*return daysDiff($x[2],$x[0],$x[1]); $days=dateDiff("/",$now,$doj)/$year_diff; $days_exp=explode(".",$days); return $years_exp=$days; //number of years exp*/ > ?> 

Это работает в моем проекте. Я думаю, это будет полезно для вас.

Если Date находится в прошлом, инвертирование будет 1.
Если Date в будущем, то инвертирование будет 0.

$defaultDate = date('Ym-d'); $datetime1 = new DateTime('2013-03-10'); $datetime2 = new DateTime($defaultDate); $interval = $datetime1->diff($datetime2); $days = $interval->format('%a'); $invert = $interval->invert; 

Чтобы передать временную метку unix, используйте эту нотацию

$now = time(); $now = new DateTime("@$now"); 
  • функция даты в класс не работает
  • Стандартный способ переключения из / в user_timezone и gmt
  • Сколько дней до даты XYZ?
  • Как получить текущую дату и время в PHP?
  • Изменение сегодняшней даты и времени в php
  • Вычислить время, прошедшее через php, — более 24 часов
  • Как проверить, является ли идентификатор часового пояса действительным из кода?
  • python формат datetime с «st», «nd», «rd», «th» (английский порядковый суффикс), как PHP «S»
  • Месяц по неделям года?
  • Подтвердить дату рождения и проверить возраст
  • Как добавить поддержку класса DateTime в php 5.1.6
  • PHP. Определите, будет ли дата в будущем использовать объект DateTime.

Источник

date_diff

Возвращает разницу между двумя объектами DateTimeInterface .

Список параметров

Дата и время для сравнения.

Используется, чтобы вернуть абсолютную разницу.

Возвращаемые значения

DateInterval объект представляет разницу между двумя датами.

Возвращаемое значение более конкретно представляет временной интервал для применения к исходному объекту ( $this или $originObject ), чтобы прийти к $targetObject . Этот процесс не всегда обратим.

Метод учитывает смену часовых поясов и поэтому может возвращать интервал 24 hours and 30 minutes , как в одном из примеров. Если вы хотите рассчитывать по абсолютному времени, вам необходимо сначала преобразовать $this / $baseObject и $targetObject в UTC.

Примеры

Пример #1 Пример использования DateTimeImmutable::diff()

$origin = new DateTimeImmutable ( ‘2009-10-11’ );
$target = new DateTimeImmutable ( ‘2009-10-13’ );
$interval = $origin -> diff ( $target );
echo $interval -> format ( ‘%R%a дней’ );
?>

$origin = date_create ( ‘2009-10-11’ );
$target = date_create ( ‘2009-10-13’ );
$interval = date_diff ( $origin , $target );
echo $interval -> format ( ‘%R%a дней’ );
?>

Результат выполнения данных примеров:

Пример #2 Пример использования DateTimeInterface::diff() во время перехода на летнее время

$originalTime = new DateTimeImmutable ( «2021-10-30 09:00:00 Europe/London» );
$targedTime = new DateTimeImmutable ( «2021-10-31 08:30:00 Europe/London» );
$interval = $originalTime -> diff ( $targedTime );
echo $interval -> format ( «%H:%I:%S (Полных дней: %a)» ), «\n» ;
?>

Результат выполнения данного примера:

Пример #3 Сравнение объектов DateTime

$date1 = new DateTime ( «now» );
$date2 = new DateTime ( «tomorrow» );

var_dump ( $date1 == $date2 );
var_dump ( $date1 < $date2 );
var_dump ( $date1 > $date2 );
?>

Результат выполнения данного примера:

bool(false) bool(true) bool(false)

Смотрите также

  • DateInterval::format() — Форматирует интервал
  • DateTime::add() — Изменяет объект DateTime, добавляя количество дней, месяцев, лет, часов, минут и секунд
  • DateTime::sub() — Изменяет указанный объект DateTime, вычитая указанный объект DateInterval.

User Contributed Notes

Источник

Разница дат (PHP)

Для того что бы посчитать разницу между двумя датами в PHP, нужно обе даты перевести в секунды при помощи функции int strtotime(string time [, int now]) , и вычислить разницу. Результат и будет разницей.

Функция date_diff()

Напишем функцию int date_diff($date1, $date2) , которая будет принимать два параметра (дата 1 и дата 2) и возвращать разницу в секундах.

Пример

В приведенном примере, обрабатывается несколько вариантов форматов дат.

‘; $date1 = ’10 September 2010′; $date2 = ’29 September 2009′; echo date_diff($date1, $date2).’ сек.
‘; $date1 = ‘next Thursday’; $date2 = ‘last Monday’; echo date_diff($date1, $date2).’ сек.
‘; $date1 = ‘now’; $date2 = ‘2011-01-01 00:00:01′; // этот результат будет всегда разным echo date_diff($date1, $date2).’ сек.
‘; ?>

Результат

41705135 сек.
29894400 сек.
864000 сек.
10273762 сек.

Послесловие

Если хотите секунды преобразовать в нормальную дату, то прочитайте статью: Секунды в дни-часы-минуты (PHP)

Категории

Читайте также

  • Количество секунд между датами (PHP)
  • Количество минут между датами (PHP)
  • Количество дней между датами (PHP)
  • Количество часов между датами (PHP)
  • Посчитать сколько времени прошло (PHP)
  • Время выполнения скрипта (PHP)
  • Количество секунд от начала дня (PHP)
  • Как получить TIMESTAMP дня текущей недели (PHP)
  • Преобразовать дату в секунды (PHP)
  • Установить часовой пояс (PHP)
  • Дата вчера сегодня завтра (PHP)
  • Название предыдущего месяца (PHP)

Комментарии

Вход на сайт

Введите данные указанные при регистрации:

Социальные сети

Вы можете быстро войти через социальные сети:

Источник

Оцените статью