남은일수 계산
본문
<?php
date_default_timezone_set('Asia/Seoul');
$firstDate = new DateTime('2022-03-01');
$secondDate = new DateTime('2022-03-31');
$intvl = $firstDate->diff($secondDate);
echo $intvl->y . " year, " . $intvl->m." months and ".$intvl->d." day";
echo "\n";
// Total amount of days
echo $intvl->days . " days ";
//output: 0 year, 1 months and 2 day
// 30 days
3월 한달을 계산했는데 1개월이 아닌 1개월 2일로 계산되어 나옵니다 ㅠㅠ
timezone 을 UTC로 변경하면 30일로 나오게 되고
여기서 secondDate를 2022-04-01로 바꾸면 1개월로 나옵니다.
<?php
//date_default_timezone_set('Asia/Seoul');
date_default_timezone_set('UTC');
$firstDate = new DateTime('2022-03-01');
$secondDate = new DateTime('2022-03-31');
$intvl = $firstDate->diff($secondDate);
echo $intvl->y . " year, " . $intvl->m." months and ".$intvl->d." day";
echo "\n";
// Total amount of days
echo $intvl->days . " days ";
//output: 0 year, 0 months and 30 day
// 30 days
적용중인 코드입니다. 어떻게 해야 3월 한달을 1개월로 인식하게 할수있을까요?
!-->!-->답변 3
확인해보니 DST처리 오류로 인한 문제라고 합니다.
예전부터 있던 문제인데 아직 처리가 명확하지 않다고 합니다.
일광 절약 시간제(日光節約時間制, 미국 영어: Daylight saving time, DST) 또는 써머 타임(영국 영어: summer time)
제가 테스트한 서버 2개가 결과가 상이하길래 확인해봤습니다.
차이가 없었던건 웹기반 PHP 에뮬레이터였고
차이가 질문자님과 동일했던건 php7.3 설치된 서버였습니다.
해결방법은 날짜의 차이를 diff 로 계산할떄 UTC로 타임존을 설정 하라네요.
https://fullstackuser.com/code-snippets/phps-datetimediff-gets-it-wrong
2022-03-01 00:00:00
2022-03-31 23:59:59
30일 맞습니다. 1초가 부족하거든요.
2022-03-01 00:00:00
2022-04-01 00:00:00
이 기준이 1month 겠죠
정상적인 서버 기준으로
Asia/Seoul 로 타임존을 설정했을때도 동일하게 출력됩니다.
위 타임존에서 이상하게 뜬다면 서버의 시간동기화를 한번 해보세요.
제가 위 코드로 테스트해봤을때
타임존에 따른 계산 차이는 제 서버에는 없었습니다.