두 날짜 사이의 개월 수를 계산하는 우아한 방법?
변수에 두 개의 날짜가 있다고 가정 해 봅시다.
$date1 = "2009-09-01";
$date2 = "2010-05-01";
$date2
와 $date1
( $date2 >= $date1
) 사이의 개월 수를 가져와야 합니다. 즉, 나는 얻을 필요가 8
있습니다.
날짜 함수 를 사용하여 얻을 수있는 방법이 있습니까 , 아니면 문자열을 분해하고 계산을해야합니까?
고맙습니다
PHP의 경우> = 5.3
$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-05-01");
var_dump($d1->diff($d2)->m); // int(4)
var_dump($d1->diff($d2)->m + ($d1->diff($d2)->y*12)); // int(8)
DateTime :: diff는 DateInterval 객체를 반환 합니다.
PHP 5.3 이상으로 실행하지 않으면 유닉스 타임 스탬프를 사용해야 할 것 같습니다.
$d1 = "2009-09-01";
$d2 = "2010-05-01";
echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8
그러나 그것은 매우 정확하지 않습니다 (항상 한 달에 30 일이있는 것은 아닙니다).
마지막으로, 해당 날짜가 데이터베이스에서 가져온 경우 PHP가 아닌 DBMS를 사용하여이 작업을 수행하십시오.
편집 : DateTime :: diff 또는 RDBMS를 사용할 수없는 경우이 코드는 더 정확해야합니다.
$d1 = strtotime("2009-09-01");
$d2 = strtotime("2010-05-01");
$min_date = min($d1, $d2);
$max_date = max($d1, $d2);
$i = 0;
while (($min_date = strtotime("+1 MONTH", $min_date)) <= $max_date) {
$i++;
}
echo $i; // 8
또는 절차 스타일을 원하는 경우 :
$date1 = new DateTime("2009-09-01");
$date2 = new DateTime("2010-05-01");
$interval = date_diff($date1, $date2);
echo $interval->m + ($interval->y * 12) . ' months';
업데이트 : 몇 년 동안 코드를 추가했습니다.
또는 간단한 계산은 다음과 같습니다.
$numberOfMonths = abs((date('Y', $endDate) - date('Y', $startDate))*12 + (date('m', $endDate) - date('m', $startDate)))+1;
정확하고 모든 경우에서 작동합니다.
수많은 솔루션을 테스트하고 모든 것을 단위 테스트에 넣은 후 다음과 같이 나왔습니다.
/**
* Calculate the difference in months between two dates (v1 / 18.11.2013)
*
* @param \DateTime $date1
* @param \DateTime $date2
* @return int
*/
public static function diffInMonths(\DateTime $date1, \DateTime $date2)
{
$diff = $date1->diff($date2);
$months = $diff->y * 12 + $diff->m + $diff->d / 30;
return (int) round($months);
}
예를 들어 다음을 반환합니다 (단위 테스트의 테스트 케이스).
- 2013 년 11 월 1 일-2013 년 11 월 30 일-1 개월
- 2013 년 1 월 1 일-2013 년 12 월 31 일-12 개월
- 2011.01.31-2011.02.28-1 개월
- 2009 년 1 월 9 일-2010 년 5 월 1 일-8 개월
- 2013 년 1 월 1 일-2013 년 3 월 31 일-3 개월
- 2013 년 2 월 15 일-2013 년 4 월 15 일-2 개월
- 1985 년 1 월 2 일-2013 년 12 월 31 일-347 개월
주의 사항 : 날짜와 함께 반올림되기 때문에 한 달 반도 반올림되므로 일부 경우에 사용하면 문제가 발생할 수 있습니다. 따라서 이러한 경우에는 사용하지 마십시오. 문제가 발생할 수 있습니다.
예를 들면 :
- 2013 년 2 월 11 일-2013 년 12 월 31 일은 예상대로 1이 아닌 2를 반환합니다.
이것은 두 날짜 사이의 개월 수를 얻는 또 다른 방법입니다.
// Set dates
$dateIni = '2014-07-01';
$dateFin = '2016-07-01';
// Get year and month of initial date (From)
$yearIni = date("Y", strtotime($dateIni));
$monthIni = date("m", strtotime($dateIni));
// Get year an month of finish date (To)
$yearFin = date("Y", strtotime($dateFin));
$monthFin = date("m", strtotime($dateFin));
// Checking if both dates are some year
if ($yearIni == $yearFin) {
$numberOfMonths = ($monthFin-$monthIni) + 1;
} else {
$numberOfMonths = ((($yearFin - $yearIni) * 12) - $monthIni) + 1 + $monthFin;
}
나는 이것을 사용한다 :
$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-09-01");
$months = 0;
$d1->add(new \DateInterval('P1M'));
while ($d1 <= $d2){
$months ++;
$d1->add(new \DateInterval('P1M'));
}
print_r($months);
DateTime을 사용하면 몇 개월 동안 더 정확한 솔루션을 얻을 수 있습니다.
$d1 = new DateTime("2011-05-14");
$d2 = new DateTime();
$d3 = $d1->diff($d2);
$d4 = ($d3->y*12)+$d3->m;
echo $d4;
$d3->d
실제 문제가 두 날짜가 매월 1 일인 원래 질문만큼 간단하지 않고 잘리고 건조하지 않은 경우 남은 날을 처리해야합니다 .
이것은 주어진 두 날짜에 관련된 개월 수를 계산하기 위해 수업에서 작성한 간단한 방법입니다.
public function nb_mois($date1, $date2)
{
$begin = new DateTime( $date1 );
$end = new DateTime( $date2 );
$end = $end->modify( '+1 month' );
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($begin, $interval, $end);
$counter = 0;
foreach($period as $dt) {
$counter++;
}
return $counter;
}
나는 이것을 사용하고 모든 조건에서 작동합니다
$fiscal_year = mysql_fetch_row(mysql_query("SELECT begin,end,closed FROM fiscal_year WHERE id = '2'"));
$date1 = $fiscal_year['begin'];
$date2 = $fiscal_year['end'];
$ts1 = strtotime($date1);
$ts2 = strtotime($date2);
$te=date('m',$ts2-$ts1);
echo $te;
날짜가 mySQL 쿼리 결과 집합의 일부인 경우 날짜 계산에 TIMESTAMPDIFF 함수를 사용하는 것이 훨씬 쉽고 반환 단위를 지정할 수 있습니다. Select TIMESTAMPDIFF(MONTH, start_date, end_date)months_diff from table_name
strtotime은 그다지 정확하지 않으며 대략적인 계산을하며 해당 월의 실제 날짜를 고려하지 않습니다.
it's better to bring the dates to a day that is always present in every month.
$date1 = "2009-09-01";
$date2 = "2010-05-01";
$d1 = mktime(0, 0, 1, date('m', strtotime($date1)), 1, date('Y', strtotime($date1)));
$d2 = mktime(0, 0, 1, date('m', strtotime($date2)), 1, date('Y', strtotime($date2)));
$total_month = 0;
while (($d1 = strtotime("+1 MONTH", $d1)) <= $d2) {
$total_month++;
}
echo $total_month;
참고URL : https://stackoverflow.com/questions/4233605/elegant-way-to-get-the-count-of-months-between-two-dates
'Development Tip' 카테고리의 다른 글
moment.js로 일, 월, 연도를 찾는 방법 (0) | 2020.12.09 |
---|---|
Tensorflow NaN 버그? (0) | 2020.12.09 |
조각 오류 :“ID가 0 인 GoogleApiClient를 이미 관리하고 있습니다.” (0) | 2020.12.09 |
Windows 서비스의 전체 경로 가져 오기 (0) | 2020.12.09 |
정규 표현식으로 IPv4 주소 유효성 검사 (0) | 2020.12.09 |