Javascript倒计时和时区

时间:2017-06-03 21:56:08

标签: javascript php mysql datetime

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,如果我插入DateTime,间隔为+ 8分钟,则此查询将在数据库中存储21:48。直到现在没问题,我的数据库是GTM + 00,我的电脑默认浏览器是GTM + 2。

一旦存储,我试图选择这个日期(在这种情况下)-2h + 8m并进行倒计时。

现在出现问题:要进行倒计时,我正在使用javascript而且我做21:48-now();但是他总是会比平常快2小时结束,因为MYSQL中的存储日期(21:48)与GTM + 00 BUT Javascript now();得到我的默认浏览器时间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>

1 个答案:

答案 0 :(得分:0)

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);