前提・実現したいこと
function showCountdown() の中にある
var dDays = diff2Dates / ( 1000 * 60 * 60 * 24 ); // 日数
diff2Dates = diff2Dates % ( 1000 * 60 * 60 * 24 );
var dHour = diff2Dates / ( 1000 * 60 * 60 ); // 時間
diff2Dates = diff2Dates % ( 1000 * 60 * 60 );
var dMin = diff2Dates / ( 1000 * 60 ); // 分
diff2Dates = diff2Dates % ( 1000 * 60 );
var dSec = diff2Dates / 1000; // 秒
var msg2 = Math.floor(dDays) + "日"
+ Math.floor(dHour) + "時間"
+ Math.floor(dMin) + "分"
+ Math.floor(dSec) + "秒";
という表記でどうしてもdDays の表記の日時が30日多く表記されてしまいます。
diff2Datesに関連する数値は基本作動しており、書き方としても大きな間違いはしてないと思います。
なので30日多く検出される原因を突き止めたいです。
該当のソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="uft8"> <title>time</title> <?php try { $db = new PDO('mysql:dbname=bulletinboard;host=127.0.0.1;charset=utf8','root', '' ); } catch (PDOException $e) { echo "データベース接続エラー :".$e->getMessage(); } $records = $db->query('SELECT * FROM chat WHERE id=9 '); $record = $records->fetch(); $day=0; $hour=0; //簡易タイマーPHP(指定した日時~日時までの期間だけ表示します) //設置するページの拡張子は必ず.phpとなっている必要があります。 //表示開始日時(この日時になったら表示されます) //※日時のフォーマットは必ず「2021-05-17 08:00:00」のようにしてください。 $startDate = $record['modified']; $datetime = date($startDate); list($year, $month, $day, $hour, $minute, $second) = preg_split('/[-: ]/', $datetime); function time_change($hour, $day, $month, $year) { if ($hour>24) { $hour-= 24; $day += 1; switch ($day>=28) { case $month = 1:{ if ($day>31) { $day-= 31; $month+= 1; } } break; case $month =2:{ if ($day>28) { $day-= 28; $month+= 1; } } break; case $month=3: case $month=5: case $month=7: case $month=8: case $month=10:{ if ($day>31) { $day-= 31; $month+= 1; } } break; case $month=4: { if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=6:{ if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=9:{ if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=11: { if ($day>30) { $day-= 30; $month+= 1; } } break; case $month=12: { if ($day>31) { $day-= 31; $month-= 11; $year+=1; } } break; default: break; } } }; if($record['time_limit'] == '2hours'){ $hours= 02; $hour+= $hours; time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '6hours'){ $hours = 06; $hour+= $hours; time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '1day'){ $days = 01; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '3day'){ $days = 03; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '5day'){ $days = 05; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '1week'){ $days = 07; $day += $days;time_change($hour, $day, $month, $year); } elseif($record['time_limit'] == '2week'){ $days = 14; $day += $days; time_change($hour, $day, $month, $year); } date_default_timezone_set('Asia/Tokyo');//タイムゾーン (日本以外の場合には適宜設定ください) //表示終了日時(この日時になったら非表示になります) //※日時のフォーマットは必ず「2021-05-17 08:00:00」のようにしてください。 $setdate = ("$year-$month-$day $hour:$minute:$second"); $endDate=date($setdate); //var diff2dates のデータ型を数値にして返すそのための if(date('Y-m-d H:i:s') >= $startDate && date('Y-m-d H:i:s') < $endDate){ ?> <script type="text/javascript"> function showCountdown() { var targetdate =new Date(<?php echo $year?>, <?php echo $month?>, <?php echo $day?>, <?php echo $hour?>, <?php echo $minute?>, <?php echo $second?>); var dnumTarget =targetdate.getTime(); var nowDate = new Date(); var dnumNow = nowDate.getTime(); //diff2Datesをミリ秒の直して表記させる var diff2Dates = dnumTarget - dnumNow; if( dnumTarget < dnumNow ) { // 期限が過ぎた場合は -1 を掛けて正の値に変換 diff2Dates *= -1; } var msg1 = "期限の<?php echo $endDate?>"; // 差の秒を、日数・時間・分・秒に分割 var dDays = diff2Dates / ( 1000 * 60 * 60 * 24 ); // 日数 diff2Dates = diff2Dates % ( 1000 * 60 * 60 * 24 ); var dHour = diff2Dates / ( 1000 * 60 * 60 ); // 時間 diff2Dates = diff2Dates % ( 1000 * 60 * 60 ); var dMin = diff2Dates / ( 1000 * 60 ); // 分 diff2Dates = diff2Dates % ( 1000 * 60 ); var dSec = diff2Dates / 1000; // 秒 var msg2 = Math.floor(dDays) + "日" + Math.floor(dHour) + "時間" + Math.floor(dMin) + "分" + Math.floor(dSec) + "秒"; // 表示文字列の作成 var msg; if( dnumTarget > dnumNow ) { // まだ期限が来ていない場合 msg = msg1 + "までは、あと" + msg2 + "です。"; } else { // 期限が過ぎた場合 msg = msg1 + "は、既に" + msg2 + "前に過ぎました。"; } // 作成した文字列を表示 document.getElementById("RealtimeCountdownArea").innerHTML = msg; } // 1秒ごとに実行 setInterval('showCountdown()',1000); </script> <?php } ?> </head> <body> <input type=button onclick="showCountdown();" > <p id="RealtimeCountdownArea"></p> <p></p> </body> </html>