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