datetime — PHP для вычисления диапазона дат, когда один — Y, а другой — Y-m-d

В PHP я бы хотел посчитать возраст человека. Например, человек А родился в 1790-06-09 и умер в 1854 году, но есть также возможность иметь человека Б, который родился в 1954 году и умер в 1990-02-05 , Поскольку одна из дат не является полной, Y (т.е. гггг в ISO8601) можно рассматривать как Y-01-01. Y доступен в виде строки.

Я пытался преобразовать строку даты в DateTime и вычислить (см. Ниже), но не был уверен, как создать Y-01-01 и как справиться с делом лица B в том же коде для лица A.

$d1 = new DateTime($birthdate);
$d2 = new DateTime($deathdate);
$diff = $d2->diff($d1);

Умное решение высоко ценится. Спасибо!

0

Решение

использование DateTime::createFromFormat()

$birthdate = "1790-06-09";
$deathdate = "1854";

$d1 = new DateTime($birthdate);
$d2 = DateTime::createFromFormat('Y', $deathdate);

echo $d1->diff($d2)->y;

Редактировать: Вы можете проверить формат даты с preg_match, Это пример проверки Y-m-d формат:

function dateYmdValid($date){
return (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date)) ? true : false;
}

$birthdate = "1790-06-09";
$deathdate = "1854";

$d1 = dateYmdValid($birthdate) ? new DateTime($birthdate)
: DateTime::createFromFormat('Y', $birthdate);
$d2 = dateYmdValid($deathdate) ? new DateTime($deathdate)
: DateTime::createFromFormat('Y', $deathdate);

echo $d1->diff($d2)->y;

Выход: 63

2

Другие решения

Может быть, это может помочь вам:

<?php

function calculateAge($born, $death) {
$born = strpos($born, '-') === false ? $born . '-01-01' : $born;
$death = strpos($death, '-') === false ? $death . '-01-01' : $death;

$d1 = new DateTime($born);
$d2 = new DateTime($death);
return $d2->diff($d1)->y;
}

Вам просто нужно проверить, если - char присутствует, чтобы предполагать, что дата «ОК». Я также предполагаю, что вы всегда будете получать действительную дату или только год.

1

По вопросам рекламы [email protected]