【问题标题】:Javascript countdown and TimezonesJavascript 倒计时和时区
【发布时间】:2017-11-05 01:02:42
【问题描述】:

enter image description here
基本上,我用 SQL 查询插入了一个带有日期时间 + 间隔(未来的东西)的行。

    $interval = new DateInterval('PT'.$H.'H'.$i.'M'.$s.'S');
    $date = new DateTime(); $date->add($interval);
    $query = $conn->prepare("INSERT INTO profiles_in_missions (id_pim, id_profile, id_mission, time) VALUES (NULL, :idprofile, :idmission,:time)");
    $query->bindValue(':idprofile', $tableau[0]);
    $query->bindValue(':idmission', $id);
    $query->bindValue(':time', $date->format('Y-m-d H:i:s'));
    $query->execute();

如果我的电脑显示:23:40,并且如果我以 +8 分钟的间隔插入 DateTime,则此查询将 21:48 存储在数据库中。到目前为止,我的数据库是 GTM+00,我的电脑默认浏览器是 GTM+2。

存储后,我会尝试选择(在这种情况下)-2h+8m 的日期并进行倒计时。

现在的问题是: 为了进行倒计时,我正在使用 javascript 并且我执行 21:48-now();但他总是会比平时快 2 小时结束,因为在 MYSQL 中使用 GTM+00 BUT Javascript now() 存储的日期(21:48);正在获取我的默认浏览器时间 GTM+2。

有没有办法让 Javascript 与服务器 Timezone GTM+00 一起工作?我该如何解决我的问题?我所有的倒计时代码都有:

<script>

var t = document.getElementById('myInputTimer').value;
var countDownDate = new Date(t).getTime();

// Update the count down every 1 second
var x = setInterval(function() {

  // Get todays date and time
  var now = new Date().getTime();

  // Find the distance between now an the count down date
  var distance = countDownDate - now;

  // Time calculations for days, hours, minutes and seconds
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);

  // Display the result in the element with id="demo"
  document.getElementById("demo").innerHTML = hours + "h "
  + minutes + "m " + seconds + "s ";

  // If the count down is finished, write some text
  if (distance < 0) {
    clearInterval(x);
    document.getElementById("demo").innerHTML = "EXPIRED";
  }
}, 1000);
</script>

【问题讨论】:

    标签: javascript php mysql datetime


    【解决方案1】:

    new Date().getTime()(可以替换为Date.now())只返回从日期零开始的毫秒数。时区在这里不是一个因素,而时区在这里是一个因素:

    var t = document.getElementById('myInputTimer').value;
    var countDownDate = new Date(t).getTime();
    

    如果您用于创建日期对象的字符串不包含任何时区信息,则它假定为浏览器的时区。
    我假设这个字符串是你在 UTC 时间的日期?

    一种解决方案是确保该字符串包含时区信息,这意味着它看起来像这样:2017-06-03T22:23:00+00:00

    另一种解决方案是在解析日期后更正时区偏移量。所以如果new Date("2017-06-03 22:23:00") 给你Sat Jun 03 2017 22:23:00 GMT+0200 (CEST) 是20:23,你可以通过减去时区偏移来纠正它:

    var countDownDate = new Date(t).getTime() - (new Date().getTimezoneOffset() * 60 * 1000);
    

    .getTimezoneOffset()以分钟为单位返回时区偏移量,我们计算它是多少毫秒,然后从.getTime()返回的毫秒数中减去它

    使用字符串来创建日期并不是最好的主意,因为它依赖于实现且不可靠。最好解析出各种组件(年、月、日、小时等)并用它们构建日期。您可以使用正则表达式解析出这样的组件:

    var dateParts = t.match(/\d+/g);
    

    最好的部分是现在您可以使用Date.UTC() 而不是new Date(t).getTime() 直接获取UTC 时间:

    var countDownDate = Date.UTC.apply(null, dateParts); 
    

    【讨论】:

    • 我现在只想吻你!非常感谢。非常感谢您花时间在该 anwser 上。他工作 100%
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多