倒计时与 PHP 的 Javascript 错误计算

我正在尝试制作倒数计时器。我正在使用 PHP 和 Javascript。我面临的问题是时差显示比 php 晚了一段时间。如果 PHP 显示 19 小时,则 Javascript 显示 16 小时。


我的函数显示与 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-13 15:24:22


function countdownTimer() {

    const difference = +new Date("<?php echo $job['job_expiration']; ?>") - +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);


温温酱
浏览 121回答 1
1回答

当年话下

它看起来像一个时区差异问题。如果您在 中输入类似“2020-05-13 15:24:22”的字符串Date(),它会假定该字符串在计算机的时区内。例如,我的电脑处于太平洋夏令时 (GMT - 7) 时区:let&nbsp;date1&nbsp;=&nbsp;new&nbsp;Date("2020-05-13&nbsp;10:56:50"); console.log(date1);&nbsp;//&nbsp;'2020-05-13T17:56:50.000Z'请注意,Date7 小时后将我的太平洋夏令时转换为 UTC。如果您只是简单地调用Date()而不带任何参数,您将获得 UTC 时区的当前日期和时间:let&nbsp;date2&nbsp;=&nbsp;new&nbsp;Date(); console.log(date2);&nbsp;//&nbsp;'2020-05-12T17:57:36.088Z'从示例中很难确定,但很可能是 PHP 时间:<?php&nbsp;echo&nbsp;$job['job_expiration'];&nbsp;?>在服务器的时区中,但 JavaScript 在具有不同时区的客户端计算机上运行。关于处理时区的建议避免弄乱时区的一个好规则是始终以 UTC 格式存储和操作日期,然后将它们转换为本地时间仅用于显示。如果您使用字符串作为 的参数new Date,请确保该字符串采用 UTC 时间:let&nbsp;date&nbsp;=&nbsp;new&nbsp;Date('2020-05-12T17:56:50.000Z');尾随的“Z”表示此日期字符串处于 UTC(“zulu”)时区。
打开App,查看更多内容
随时随地看视频慕课网APP