В 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);
Умное решение высоко ценится. Спасибо!
использование 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
Может быть, это может помочь вам:
<?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 присутствует, чтобы предполагать, что дата «ОК». Я также предполагаю, что вы всегда будете получать действительную дату или только год.