首页 > 解决方案 > Javascript 计时器比 php mysql 晚 5 小时

问题描述

我正在开发一个用户可以发布/申请工作的项目。如果用户发布了一个交货时间为 2 天的工作。插入数据库时​​,我在当前时间增加了 2 天。然后我向用户显示倒计时,显示 PHP 和 Javascript 还剩下多少天、小时、分钟、秒。但是 Javascript 比 PHP 晚了 5 个小时。我问过这个问题,用户告诉我:这看起来像是时区差异问题。我必须以 UTC 存储和操作日期。

为了让 PHP 使用 UTC,我做了:date_default_timezone_set('UTC');

对于 Mysql:UTC_TIMESTAMP() + INTERVAL " . $job['delivery_time'] . "

对于 Javascript:var endDate = new Date("<?php echo $job['job_expiration']; ?>");

但是计时器仍然比 PHP、Mysql 晚了 5 个小时。

"INSERT INTO jobs(job_expiration) VALUES(UTC_TIMESTAMP() + INTERVAL " . $job['delivery_time'] . ")";像这样。

我正在使用UTC_TIMESTAMPNOW()因此我可以选择时间少于四个小时的工作,而无需选择所有工作。

我该如何解决这个问题?

<?php

$timestamp = strtotime($time['expiration']) - time();

function convert_timestamp_to_date($timestamp)
{
  $date1 = new DateTime("@0");
  $date2 = new DateTime("@$timestamp");
  if ($date1->diff($date2)->d < 1) {
    return $date1->diff($date2)->format('%h Hours');
  } else {
    return $date1->diff($date2)->format('%a Days');
  }
}

这是Javascript代码:

// $job['job_expiration'] = 2020-05-17 13:30:24

function countdownTimer() {
    // original code
  //const difference = +new Date("<?php echo $job['job_expiration']; ?>") - +new Date();
    // modified for stackoverflow
    const difference = +new Date("2020-05-17 13:30:24") - +new Date();
    let remaining = "Time's up!";

    if (difference > 0) {
        const parts = {
            days: Math.floor(difference / (1000 * 60 * 60 * 24)),
            hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
            minutes: Math.floor((difference / 1000 / 60) % 60),
            seconds: Math.floor((difference / 1000) % 60)
        };

        remaining = Object.keys(parts)
            .map(part => {
                if (!parts[part]) return;
                return `${parts[part]} ${part}`;
            })
            .join(" ");
    }

    document.getElementById("countdown").innerHTML = remaining;
}

countdownTimer();
setInterval(countdownTimer, 1000);
<div id="countdown"></div>

标签: javascriptmysqldatetime

解决方案


推荐阅读