남은일수 계산

남은일수 계산

QA

남은일수 계산

본문



<?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 로 타임존을 설정했을때도 동일하게 출력됩니다.

위 타임존에서 이상하게 뜬다면 서버의 시간동기화를 한번 해보세요.

 

제가 위 코드로 테스트해봤을때

타임존에 따른 계산 차이는 제 서버에는 없었습니다.

리눅스 서버에서 date 명령어로 확인한 시간입니다.
Thu Mar 31 12:54:13 KST 2022

2022-03-01 00:00:00
2022-03-31 23:59:59
으로 테스트값을 세팅 후 결과가 0 year, 1 months and 2 day 이렇게 나와요

답변을 작성하시기 전에 로그인 해주세요.
전체 27
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT