PHP 계산 기간
dd/mm/yyy 형식의 DOB를 사용하여 연령을 계산하는 방법을 찾고 있습니다.
저는 몇 달 동안 정상적으로 동작하던 다음 기능을 사용하고 있었는데, 그 후 어떤 결함으로 인해 while loop이 끝나지 않고 사이트 전체가 정지되었습니다.하루에도 여러 차례 이 기능을 수행하는 DOB가 10만 건에 육박하기 때문에 원인이 무엇인지 정확히 밝히기는 어렵다.
더 믿을 수 있는 나이 계산법을 가진 사람이 있나요?
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));
$tdate = time();
$age = 0;
while( $tdate > $dob = strtotime('+1 year', $dob))
{
++$age;
}
return $age;
EDIT: 이 함수는 때때로 정상적으로 작동하는 것처럼 보이지만 DOB가 1986년 14월 9일 경우 "40"을 반환합니다.
return floor((time() - strtotime($birthdayDate))/31556926);
이거 잘 돼.
<?php
//date in mm/dd/yyyy format; or it can be in other formats as well
$birthDate = "12/17/1983";
//explode the date to get month, day and year
$birthDate = explode("/", $birthDate);
//get age from date or birthdate
$age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
? ((date("Y") - $birthDate[2]) - 1)
: (date("Y") - $birthDate[2]));
echo "Age is:" . $age;
?>
$tz = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
->diff(new DateTime('now', $tz))
->y;
5.한 PHP 5.3.0을 할 수 .DateTime::createFromFormat
를 짜짜 to to to to 위해m/d/Y
과 " " "DateInterval
경유)DateTime::diff
를 사용하여 현재와 목표 날짜 사이의 년 수를 구합니다.
$date = new DateTime($bithdayDate);
$now = new DateTime();
$interval = $now->diff($date);
return $interval->y;
이 경우 날짜/시간을 사용합니다.
$age = date_diff(date_create($bdate), date_create('now'))->y;
도브에서 경과시간을 계산하는 간단한 방법:
$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
31556926
1번으로 하다
나는 이것이 효과가 있고 간단하다고 생각한다.
strtotime은 1970-01-01의 시간을 계산하므로 1970에서 뺍니다(http://php.net/manual/en/function.strtotime.php)
function getAge($date) {
return intval(date('Y', time() - strtotime($date))) - 1970;
}
결과:
Current Time: 2015-10-22 10:04:23
getAge('2005-10-22') // => 10
getAge('1997-10-22 10:06:52') // one 1s before => 17
getAge('1997-10-22 10:06:50') // one 1s after => 18
getAge('1985-02-04') // => 30
getAge('1920-02-29') // => 95
// 연령 계산기
function getAge($dob,$condate){
$birthdate = new DateTime(date("Y-m-d", strtotime(implode('-', array_reverse(explode('/', $dob))))));
$today= new DateTime(date("Y-m-d", strtotime(implode('-', array_reverse(explode('/', $condate))))));
$age = $birthdate->diff($today)->y;
return $age;
}
$dob='06/06/1996'; //date of Birth
$condate='07/02/16'; //Certain fix Date of Age
echo getAge($dob,$condate);
사람의 현재 나이를 계산하기 위해 PHP 스크립트를 작성합니다.
샘플 생년월일 : 1987년 4월 11일
솔루션 예시:
PHP 코드:
<?php
$bday = new DateTime('11.4.1987'); // Your date of birth
$today = new Datetime(date('m.d.y'));
$diff = $today->diff($bday);
printf(' Your age : %d years, %d month, %d days', $diff->y, $diff->m, $diff->d);
printf("\n");
?>
출력 예:
나이 : 30세, 3개월, 0일
이 질문의 가장 인기 있는 형태인 것 같아서 여기에 던져야 겠다고 생각했어요.
저는 PHP에서 찾을 수 있는 가장 인기 있는 세 가지 유형의 연령 펑크를 100년 비교한 후 제 블로그에 결과(기능도 포함)를 올렸습니다.
보시다시피 두 번째 기능에서는 3개의 펑크 모두 약간의 차이만 있어도 잘 준비됩니다.제 결과에 근거해 제안하고 싶은 것은, 생일날 특별한 일을 하고 싶지 않은 경우는, 제3의 기능을 사용하는 것입니다.이 경우, 제1의 기능은 그것을 간단하게 할 수 있습니다.
테스트에서 작은 문제가 발견되었고, 두 번째 방법에서 다른 문제가 발견되었습니다!블로그에 곧 업데이트될 예정입니다!현재로선 두 번째 방법이 여전히 온라인에서 가장 인기 있는 방법이지만, 여전히 가장 부정확한 방법이라는 점에 유의해야 합니다.
100년 리뷰 후 제안사항:
생일 등의 이벤트를 포함할 수 있도록 좀 더 긴 것을 원하는 경우:
function getAge($date) { // Y-m-d format
$now = explode("-", date('Y-m-d'));
$dob = explode("-", $date);
$dif = $now[0] - $dob[0];
if ($dob[1] > $now[1]) { // birthday month has not hit this year
$dif -= 1;
}
elseif ($dob[1] == $now[1]) { // birthday month is this month, check day
if ($dob[2] > $now[2]) {
$dif -= 1;
}
elseif ($dob[2] == $now[2]) { // Happy Birthday!
$dif = $dif." Happy Birthday!";
};
};
return $dif;
}
getAge('1980-02-29');
하지만 단순히 나이를 알고 싶을 뿐 그 이상은 알고 싶지 않다면, 다음과 같이 하십시오.
function getAge($date) { // Y-m-d format
return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}
getAge('1980-02-29');
블로그 참조
방법에 대한 주요 주의사항:
Note:
Dates in the m/d/y or d-m-y formats are disambiguated by looking at the
separator between the various components: if the separator is a slash (/),
then the American m/d/y is assumed; whereas if the separator is a dash (-)
or a dot (.), then the European d-m-y format is assumed. If, however, the
year is given in a two digit format and the separator is a dash (-, the date
string is parsed as y-m-d.
To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or
DateTime::createFromFormat() when possible.
DOB 사용 기간을 계산하려면 이 기능을 사용할 수도 있습니다.Date Time 개체를 사용합니다.
function calcutateAge($dob){
$dob = date("Y-m-d",strtotime($dob));
$dobObject = new DateTime($dob);
$nowObject = new DateTime();
$diff = $dobObject->diff($nowObject);
return $diff->y;
}
DateTime의 API 확장 버전인 라이브러리를 사용할 수 있습니다.
다음과 같은 작업을 수행할 수 있습니다.
function calculate_age($date) {
$date = new \Carbon\Carbon($date);
return (int) $date->diffInYears();
}
또는 다음과 같이 입력합니다.
$age = (new \Carbon\Carbon($date))->age;
정확한 연수가 필요 없는 경우 아래 코드를 사용하는 것을 고려해 보십시오.
print floor((time() - strtotime("1971-11-20")) / (60*60*24*365));
이를 함수에 넣고 날짜 '1971-11-20'을 변수로 바꾸기만 하면 됩니다.
상기 코드의 정밀도는 윤년이므로 높지 않습니다.즉, 4년마다 365일이 아닌 366일이 됩니다.식 60*60*24*365는 1년간의 초수를 계산합니다.31536000으로 대체할 수 있습니다.
또 다른 중요한 것은 UNIX 타임스탬프 사용으로 인해 1901년 이전과 2038년 이후의 날짜에는 위의 표현이 올바르게 작동하지 않는다는 것입니다.
상기의 제한을 견딜 수 있으면, 그 코드가 유효합니다.
$birthday_timestamp = strtotime('1988-12-10');
// Calculates age correctly
// Just need birthday in timestamp
$age = date('md', $birthday_timestamp) > date('md') ? date('Y') - date('Y', $birthday_timestamp) - 1 : date('Y') - date('Y', $birthday_timestamp);
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));
$tdate = time();
return date('Y', $tdate) - date('Y', $dob);
function dob ($birthday){
list($day,$month,$year) = explode("/",$birthday);
$year_diff = date("Y") - $year;
$month_diff = date("m") - $month;
$day_diff = date("d") - $day;
if ($day_diff < 0 || $month_diff < 0)
$year_diff--;
return $year_diff;
}
나는 이 대본을 신뢰할 수 있다는 것을 알았다.날짜 형식은 YYY-mm-dd이지만 다른 형식에서는 쉽게 변경할 수 있습니다.
/*
* Get age from dob
* @param dob string The dob to validate in mysql format (yyyy-mm-dd)
* @return integer The age in years as of the current date
*/
function getAge($dob) {
//calculate years of age (input string: YYYY-MM-DD)
list($year, $month, $day) = explode("-", $dob);
$year_diff = date("Y") - $year;
$month_diff = date("m") - $month;
$day_diff = date("d") - $day;
if ($day_diff < 0 || $month_diff < 0)
$year_diff--;
return $year_diff;
}
i18n:
function getAge($birthdate, $pattern = 'eu')
{
$patterns = array(
'eu' => 'd/m/Y',
'mysql' => 'Y-m-d',
'us' => 'm/d/Y',
);
$now = new DateTime();
$in = DateTime::createFromFormat($patterns[$pattern], $birthdate);
$interval = $now->diff($in);
return $interval->y;
}
// Usage
echo getAge('05/29/1984', 'us');
// return 28
Date Time 개체를 사용하여 다음 중 하나를 시도합니다.
$hours_in_day = 24;
$minutes_in_hour= 60;
$seconds_in_mins= 60;
$birth_date = new DateTime("1988-07-31T00:00:00");
$current_date = new DateTime();
$diff = $birth_date->diff($current_date);
echo $years = $diff->y . " years " . $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $months = ($diff->y * 12) + $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $weeks = floor($diff->days/7) . " weeks " . $diff->d%7 . " day(s)"; echo "<br/>";
echo $days = $diff->days . " days"; echo "<br/>";
echo $hours = $diff->h + ($diff->days * $hours_in_day) . " hours"; echo "<br/>";
echo $mins = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour) . " minutest"; echo "<br/>";
echo $seconds = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour * $seconds_in_mins) . " seconds"; echo "<br/>";
레퍼런스 http://www.calculator.net/age-calculator.html
이것은 년, 월, 일별 연령별 특정 수익률로 DOB를 계산하는 나의 기능이다.
function ageDOB($y=2014,$m=12,$d=31){ /* $y = year, $m = month, $d = day */
date_default_timezone_set("Asia/Jakarta"); /* can change with others time zone */
$ageY = date("Y")-intval($y);
$ageM = date("n")-intval($m);
$ageD = date("j")-intval($d);
if ($ageD < 0){
$ageD = $ageD += date("t");
$ageM--;
}
if ($ageM < 0){
$ageM+=12;
$ageY--;
}
if ($ageY < 0){ $ageD = $ageM = $ageY = -1; }
return array( 'y'=>$ageY, 'm'=>$ageM, 'd'=>$ageD );
}
사용방법
$age = ageDOB(1984,5,8); /*(현지시각은 2014-07-01*/)에코 스프린트프레이지 = %d년 %d개월 %d일",$age['y'',$age['m'],$age['d']; /* 출력 -> 연령 = 29년 1개월 24일 */
이 함수는 나이(년)를 반환합니다.입력값은 생년월일 형식(YYY-MM-DD)입니다(예: 2000-01-01).
낮의 정확성으로 동작합니다.
function getAge($dob) {
//calculate years of age (input string: YYYY-MM-DD)
list($year, $month, $day) = explode("-", $dob);
$year_diff = date("Y") - $year;
$month_diff = date("m") - $month;
$day_diff = date("d") - $day;
// if we are any month before the birthdate: year - 1
// OR if we are in the month of birth but on a day
// before the actual birth day: year - 1
if ( ($month_diff < 0 ) || ($month_diff === 0 && $day_diff < 0))
$year_diff--;
return $year_diff;
}
건배, 니라
만약 당신이 나이만큼만 받고 싶다면, 그것을 하는 아주 간단한 방법이 있습니다. "YYYYMMDD"로 포맷된 날짜를 숫자로 처리하고 추출합니다.그 후 결과를 10000으로 나누어 MMDD 부분을 소거하고 바닥으로 내린다.심플하고 장애가 발생하지 않으며 윤년 및 현재 서버 시간을 고려해도 문제가 발생하지 않습니다.
생일 또는 대부분 출생지의 전체 날짜에 의해 제공되며 CURRENT LOCAL TIME(실제로 연령 확인이 이루어지는 곳)과 관련이 있습니다.
$now = date['Ymd'];
$birthday = '19780917'; #september 17th, 1978
$age = floor(($now-$birthday)/10000);
따라서 생일까지 자신의 시간대(원래 시간대 무관)에서 18세 또는 21세 또는 100세 미만인지 확인하고 싶다면, 이것이 내 방법입니다.
새로운 기능을 사용할 수 없는 것 같다면, 여기 제가 준비한 것이 있습니다.아마 필요 이상으로, 그리고 더 나은 방법이 있을 것입니다만, 읽기 쉽기 때문에, 다음과 같은 작업을 할 수 있을 것입니다.
function get_age($date, $units='years')
{
$modifier = date('n') - date('n', strtotime($date)) ? 1 : (date('j') - date('j', strtotime($date)) ? 1 : 0);
$seconds = (time()-strtotime($date));
$years = (date('Y')-date('Y', strtotime($date))-$modifier);
switch($units)
{
case 'seconds':
return $seconds;
case 'minutes':
return round($seconds/60);
case 'hours':
return round($seconds/60/60);
case 'days':
return round($seconds/60/60/24);
case 'months':
return ($years*12+date('n'));
case 'decades':
return ($years/10);
case 'centuries':
return ($years/100);
case 'years':
default:
return $years;
}
}
사용 예:
echo 'I am '.get_age('September 19th, 1984', 'days').' days old';
이게 도움이 됐으면 좋겠다.
윤년이기 때문에, 한 날짜를 다른 날짜에서 빼서 년수로 바닥을 치는 것은 현명하지 않다.인간처럼 나이를 계산하려면 다음과 같은 것이 필요합니다.
$birthday_date = '1977-04-01';
$age = date('Y') - substr($birthday_date, 0, 4);
if (strtotime(date('Y-m-d')) - strtotime(date('Y') . substr($birthday_date, 4, 6)) < 0)
{
$age--;
}
아래는 나에게 매우 효과적이며, 이미 주어진 예보다 훨씬 더 간단한 것 같습니다.
$dob_date = "01";
$dob_month = "01";
$dob_year = "1970";
$year = gmdate("Y");
$month = gmdate("m");
$day = gmdate("d");
$age = $year-$dob_year; // $age calculates the user's age determined by only the year
if($month < $dob_month) { // this checks if the current month is before the user's month of birth
$age = $age-1;
} else if($month == $dob_month && $day >= $dob_date) { // this checks if the current month is the same as the user's month of birth and then checks if it is the user's birthday or if it is after it
$age = $age;
} else if($month == $dob_month && $day < $dob_date) { //this checks if the current month is the user's month of birth and checks if it before the user's birthday
$age = $age-1;
} else {
$age = $age;
}
저는 이 코드를 테스트하고 적극적으로 사용하고 있습니다만, 조금 번거로운 것 같지만, 사용이나 편집이 매우 간단하고, 매우 정확합니다.
첫 번째 논리에 따라 비교에 =를 사용해야 합니다.
<?php
function age($birthdate) {
$birthdate = strtotime($birthdate);
$now = time();
$age = 0;
while ($now >= ($birthdate = strtotime("+1 YEAR", $birthdate))) {
$age++;
}
return $age;
}
// Usage:
echo age(implode("-",array_reverse(explode("/",'14/09/1986')))); // format yyyy-mm-dd is safe!
echo age("-10 YEARS") // without = in the comparison, will returns 9.
?>
DD/MM/YYY에서 strtime을 사용하는 경우 문제가 됩니다.그 형식은 사용할 수 없습니다.대신 MM/DD/YYYY(또는 YYYYMDD나 YYY-MM-DD 등)를 사용할 수 있으며, 정상적으로 동작합니다.
이 쿼리를 실행하여 MySQL에서 계산하도록 하는 것은 어떨까요?
SELECT
username
,date_of_birth
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) DIV 12 AS years
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) MOD 12 AS months
FROM users
결과:
r2d2, 1986-12-23 00:00:00, 27 , 6
사용자는 27년 6개월(전체 1개월)입니다.
이렇게 했어요.
$geboortedatum = 1980-01-30 00:00:00;
echo leeftijd($geboortedatum)
function leeftijd($geboortedatum) {
$leeftijd = date('Y')-date('Y', strtotime($geboortedatum));
if (date('m')<date('m', strtotime($geboortedatum)))
$leeftijd = $leeftijd-1;
elseif (date('m')==date('m', strtotime($geboortedatum)))
if (date('d')<date('d', strtotime($geboortedatum)))
$leeftijd = $leeftijd-1;
return $leeftijd;
}
이에 대한 가장 중요한 대답은 OK이지만 사람이 태어난 해의 계산일 뿐이고, 나는 요일과 월을 계산하기 위해 그것을 내 목적에 맞게 조정했다.하지만 공유할 가치가 있다고 생각했어요.
이것은, 유저의 DOB 의 타임스탬프를 취득하는 것으로 동작합니다만, 변경은 자유롭게 실시할 수 있습니다.
$birthDate = date('d-m-Y',$usersDOBtimestamp);
$currentDate = date('d-m-Y', time());
//explode the date to get month, day and year
$birthDate = explode("-", $birthDate);
$currentDate = explode("-", $currentDate);
$birthDate[0] = ltrim($birthDate[0],'0');
$currentDate[0] = ltrim($currentDate[0],'0');
//that gets a rough age
$age = $currentDate[2] - $birthDate[2];
//check if month has passed
if($birthDate[1] > $currentDate[1]){
//user birthday has not passed
$age = $age - 1;
} else if($birthDate[1] == $currentDate[1]){
//check if birthday is in current month
if($birthDate[0] > $currentDate[0]){
$age - 1;
}
}
echo $age;
다음은 보다 단순하고 dd/mm/yyy 및 dd-mm-yyy 형식으로 모두 작동하는 프로세스입니다.이것은 나에게 있어서 매우 효과적이다.
<?php
$birthday = '26/04/1994';
$dob = strtotime(str_replace("/", "-", $birthday));
$tdate = time();
echo date('Y', $tdate) - date('Y', $dob);
?>
언급URL : https://stackoverflow.com/questions/3776682/php-calculate-age
'sourcecode' 카테고리의 다른 글
PHP 파일 크기 MB/KB 변환 (0) | 2022.09.19 |
---|---|
시간별로 정렬하고 특정 ID 뒤에 n개의 행을 반환하는 MySQL 쿼리 (0) | 2022.09.19 |
errno: 150 "외부 키 제약 조건이 잘못 형성되었습니다") MariaDB (0) | 2022.09.19 |
MySQL 최대 메모리 사용량 (0) | 2022.09.19 |
WHERE 절의 필드 순서가 MySQL의 성능에 영향을 미칩니까? (0) | 2022.09.19 |