D-day 계산
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
안녕하세요?
게시판 목록에 D-Day를 표시하고 있습니다.
캘린더로 확장변수값(extra_var2)을 입력받아 아래와 같은 코드로 계산해서 출력하고 있는데요.
이 코드가 코알못인 제가 그냥 꼼수로 대충 조합한거라서 문제가 많습니다.
한달이 28일, 30일, 31일 등 각각 다르지만, 31일로 고정해놓은 상태라서 동일월은 상관없지만 달이 넘어갈 경우 오차가 발생하게 됩니다.
31일로 고정되어 있는 걸 어떻게 수정해야 할까요?
<!--@if($val->eid=='extra_var2')-->
<!--@if(str_replace('.','',$document->getExtraValueHTML($val->idx)) < date('Ymd',time()))-->
<span>-</span>
<!--@elseif(str_replace('.','',$document->getExtraValueHTML($val->idx)) == date('Ymd',time()))-->
D-DAY
<!--@else-->
<!--@if((substr($document->getExtraEidValue('extra_var2'),4,2) - date('m',time())) == 0)-->
D-{substr($document->getExtraEidValue('extra_var2'),6,2) - date('d',time())}
<!--@else-->
D-{substr(31 + $document->getExtraEidValue('extra_var2'),6,2) - date('d',time())}
<!--@end-->
</div>
<!--@end-->
<!--@else-->
<!--@end-->
<!--@end-->
<!--@if(str_replace('.','',$document->getExtraValueHTML($val->idx)) < date('Ymd',time()))-->
<span>-</span>
<!--@elseif(str_replace('.','',$document->getExtraValueHTML($val->idx)) == date('Ymd',time()))-->
D-DAY
<!--@else-->
<!--@if((substr($document->getExtraEidValue('extra_var2'),4,2) - date('m',time())) == 0)-->
D-{substr($document->getExtraEidValue('extra_var2'),6,2) - date('d',time())}
<!--@else-->
D-{substr(31 + $document->getExtraEidValue('extra_var2'),6,2) - date('d',time())}
<!--@end-->
</div>
<!--@end-->
<!--@else-->
<!--@end-->
<!--@end-->
댓글 5
listeck 님 안녕하세요,
1) ChatGPT에 물어본 결과 아래와 같은 답변을 받았습니다.
ChatGPT에 질문: php로 Dday 남은 일수 계산 프로그램을 알려줘.
ChatGPT의 답변: PHP를 사용하여 D-day 남은 일수를 계산하는 간단한 프로그램을 작성할 수 있습니다. 아래는 예시 코드입니다.
<?php
// D-day 날짜 설정
$d_day = strtotime("2023-04-30");
// 오늘 날짜 설정
$today = time();
// D-day와 오늘 날짜 차이 계산
$diff = $d_day - $today;
// 초를 일 수로 변환
$days = floor($diff / (60 * 60 * 24));
// 결과 출력
echo "D-day까지 남은 일수는 ".$days."일 입니다.";
?>
이 코드는 "2023-04-30"으로 설정된 D-day 날짜와 현재 날짜의 차이를 계산하고, 일 수로 변환하여 출력합니다.
-----
2) ChatGPT의 답변을 참조하여 본문의 코드를 고쳐보면 대략 아래와 비슷할 것 같습니다. 한번 적용 해보세요.
<!--@if($val->eid=='extra_var2')-->
{@
$w_d_day_text = str_replace('.', '-', $document->getExtraValueHTML($val->idx));// D-day 날짜 설정
$w_d_day = strtotime($w_d_day_text);
$w_today = time();// 오늘 날짜 설정
$w_diff = $w_d_day - $w_today;// D-day와 오늘 날짜 차이 계산
$w_days = floor($w_diff / (60 * 60 * 24));// 초를 일 수로 변환
}
<!--@if($w_days < 0 || $val->value == "")-->
<span>-</span>
<!--@elseif($w_days == 0)-->
<span>D-DAY</span>
<!--@else-->
<span>D-{$w_days}</span>
<!--@end-->
<!--@end-->
3) 참고로 본글에 올려주신 아래 코드는 마지막<!--@end--> 와 </div> 태그가 짝이 안맞는데... 점검 해보세요.
<!--@if($val->eid=='extra_var2')-->
<!--@if(str_replace('.','',$document->getExtraValueHTML($val->idx)) < date('Ymd',time()))-->
<span>-</span>
<!--@elseif(str_replace('.','',$document->getExtraValueHTML($val->idx)) == date('Ymd',time()))-->
D-DAY
<!--@else-->
<!--@if((substr($document->getExtraEidValue('extra_var2'),4,2) - date('m',time())) == 0)-->
D-{substr($document->getExtraEidValue('extra_var2'),6,2) - date('d',time())}
<!--@else-->
D-{substr(31 + $document->getExtraEidValue('extra_var2'),6,2) - date('d',time())}
<!--@end-->
</div>
<!--@end-->
<!--@else-->
<!--@end-->
<!--@end-->
감사합니다.
ksc
챗GPT를 써볼 생각을 못했었는데 좋은 아이디어를 주셨네요.
위에 PHP 코드는 잘 작동하는 것 같은데요.
아래의 xe 코드를 삽입해보니 모두 " - " 만 나오네요. ㅠㅠ
listeck 님 안녕하세요,
$val->value 에 값이 없는 경우 " - "가 출력 되도록 조건을 추가 했는데, 이 조건이 문제일 수 있어요.
조건문에서 || $val->value == ""를 지운 아래코드로 대체해 보세요.
2) ChatGPT의 답변을 참조하여 본문의 코드를 고쳐보면 대략 아래와 비슷할 것 같습니다. 한번 적용 해보세요.
<!--@if($val->eid=='extra_var2')-->
{@
$w_d_day_text = str_replace('.', '-', $document->getExtraValueHTML($val->idx));// D-day 날짜 설정
$w_d_day = strtotime($w_d_day_text);
$w_today = time();// 오늘 날짜 설정
$w_diff = $w_d_day - $w_today;// D-day와 오늘 날짜 차이 계산
$w_days = floor($w_diff / (60 * 60 * 24));// 초를 일 수로 변환
}
<!--@if($w_days < 0)-->
<span>-</span>
<!--@elseif($w_days == 0)-->
<span>D-DAY</span>
<!--@else-->
<span>D-{$w_days}</span>
<!--@end-->
<!--@end-->
감사합니다.
ksc
|| $val->value == "" 을 제거하니 잘돼네요.
감사합니다~~
위 코드를 테스트 해보니 D-day 0시까지 24시간이 안남아 있으면 D-day로 처리 되는것 같습니다.
예를들어 현재가 3/20 23:30 이고 D-day가 3/21일이면, 3/21일이 아니라 3/20일이 D-day로 표시 됩니다.
아마도 아래처럼 남은 일수에 1을 추가 해주어야 될 것 같은데... 이리저리 한번 맞춰보세요.
$w_days = floor($w_diff / (60 * 60 * 24)) + 1;// 초를 일 수로 변환 + 1일
감사합니다.
ksc