Рассчитайте разницу между датами без дней - PullRequest
0 голосов
/ 06 декабря 2018

Есть ли хороший способ для вычисления различий между датами без дней?Например, у меня есть две неполные даты: 2017-09 и 2018-11.Мне нужно посчитать, сколько месяцев между этими двумя датами.Я прочитал кое-что об этом, и я знаю, что я могу, например, использовать:

$firstDate = "2017-09";
$secondDate = "2018-11";
$firstDate = new DateTime($firstDate . "-01"); 
$secondDate  = new DateTime($secondDate . "-01");
$interval = date_diff($firstDate, $secondDate);

var_dump($interval->format('%m months'));exit();

Это показывает мне 2 месяца.Как я могу достичь этого?И есть ли способ рассчитать это без добавления дней "-01" до конца моих дат?Я хочу рассчитать разницу месяцев для дат без записи "-01" в эти даты.Только год и месяц.

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Просто используйте простую арифметику.Мы явно не озабочены часовыми поясами, переходом на летнее время, изменениями в календаре и т. Д., Поэтому мы также не заботимся о разборе даты «в некотором часовом поясе, основанном на каком-то календаре».То, что у нас осталось, это просто арифметика, используя месяцы.Год 12 месяцев.И теперь мы почти закончили.

function ym_as_months($v) {
  $v = array_map("intval", explode("-", $v));
  return $v[0]*12 + $v[1];
}

$firstDate = "2017-09";    
$firstMonths = ym_as_months($firstDate);

$secondDate = "2018-11";    
$secondMonths = ym_as_months($secondDate);

$diff = $secondMonths - $firstMonths;
echo "There are $diff months between $firstDate and $secondDate.";

И мы получили:

Между 2017-09 и 2018-11 гг. 14 месяцев.

Отлично.

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

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

0 голосов
/ 06 декабря 2018

https://secure.php.net/manual/en/datetime.createfromformat.php

$a = DateTime::createFromFormat('Y-m', '2017-09');
$b = DateTime::createFromFormat('Y-m', '2018-11');
$diff = $a->diff($b);

var_dump(
    $a, $b,
    $diff->format("%y years, %m months"),
    sprintf("%d months", $diff->y * 12 + $diff->m)
);

Выход:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2017-09-06 18:33:58.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2018-11-06 18:33:58.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
string(17) "1 years, 2 months"
string(9) "14 months"
0 голосов
/ 06 декабря 2018

Я предложу использовать Углерод для расчета дат в PHP, поскольку это действительно упрощает все.

Чтобы рассчитать месяцы между двумя датами с помощью Carbon, вам просто нужно сделать это

//year & month
$startDate = Carbon::create('2017', '9');
$endDate = Carbon::create('2018','11');
$diff = $startDate->diffInMonths($endDate);
0 голосов
/ 06 декабря 2018

Вам также нужны годы.
Также у вас была ошибка синтаксического анализа на дату 2017-0901, которая недействительна ни на 2017-09, ни на 2017-09-01.

$firstDate = "2017-09";
$secondDate = "2018-11";
$firstDate = new DateTime($firstDate); 
$secondDate  = new DateTime($secondDate);
$interval = date_diff($firstDate, $secondDate);

echo $interval->format('%y')*12+$interval->format('%m') . " months";
// 14 months

https://3v4l.org/XGdXg

...