【问题标题】:Javascript false calculation for countdown vs php倒计时与 php 的 Javascript 错误计算
【发布时间】:2020-05-12 17:44:40
【问题描述】:

我正在尝试制作倒数计时器。我正在使用 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);

【问题讨论】:

    标签: javascript php datetime countdown


    【解决方案1】:

    看起来像是时区差异问题。

    如果您在Date() 中输入类似“2020-05-13 15:24:22”的字符串,则假定该字符串在计算机的时区中。

    例如,我的电脑处于太平洋夏令时 (GMT - 7) 时区:

    let date1 = new Date("2020-05-13 10:56:50");
    console.log(date1); // '2020-05-13T17:56:50.000Z'
    

    请注意,Date 在 7 小时后将我的太平洋夏令时间转换为 UTC。

    如果你只是简单地调用Date()而不带任何参数,你会得到UTC时区的当前日期和时间:

    let date2 = new Date();
    console.log(date2); // '2020-05-12T17:57:36.088Z'
    

    从例子中很难确定,但很可能是PHP时间:

    <?php echo $job['job_expiration']; ?>
    

    在服务器的时区中,但 JavaScript 在具有不同时区的客户端计算机上运行。

    关于处理时区的建议

    避免弄乱时区的一个好规则是始终以 UTC 存储和操作日期,然后将它们转换为本地时间仅用于显示。

    如果您使用字符串作为 new Date 的参数,请确保该字符串采用 UTC 时间:

    let date = new Date('2020-05-12T17:56:50.000Z');
    

    结尾的“Z”表示此日期字符串采用 UTC(“zulu”)时区。

    【讨论】:

    • 请注意 new Date("2020-05-13 10:56:50") 在 Safari 中返回无效日期,请参阅 Why does Date.parse give incorrect results? 将日期操作为 UTC 通常是一个好主意,但由于夏令时并不总是有效(添加 1 UTC 天总是添加24 小时,但超过夏令时边界 1 个本地日可能是 23 或 25 小时)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多