【问题标题】:Countdown changed by changing gmt of system(pc) clock通过更改系统(pc)时钟的 gmt 更改倒计时
【发布时间】:2015-09-11 10:49:33
【问题描述】:

大家好,需要帮助,

这是我的代码

function getCurrentDateByGMT(finalTimezone){
    var now = new Date();
    var localTime = now.getTime();
    var finalGMT = now.getTimezoneOffset() - finalTimezone;
    var localOffset =  finalGMT * 60000;  // where 60000 is equals to 1 min
    return new Date(localTime + localOffset);
}

此函数通过输入 gmt -480 获取当前日期,其中 gmt + 8 乘以 -60

但是每当我更改我的计算机时区时,倒计时也会改变。

在我刷新浏览器后,它回到正常的倒计时而不改变时区。

我想知道为什么有人可以帮助我解决这个问题?在此先感谢您,也感谢您的语法纠正,欢迎您编辑此问题,谢谢。

还有,谁能给我解释一下,再次感谢

更新:

好的,这是我的完整代码

function getTimeRemaining(endtime,gmt){
      var t = Date.parse(endtime) - Date.parse(getCurrentDateByGMT(gmt));
      var seconds = Math.floor( (t/1000) % 60 );
      var minutes = Math.floor( (t/1000/60) % 60 );
      var hours = Math.floor( (t/(1000*60*60)) % 24 );
      var days = Math.floor( t/(1000*60*60*24) );
      return {
        'total': t,
        'days': days,
        'hours': hours,
        'minutes': minutes,
        'seconds': seconds
      };
}

function initializeClock(hour,minute,second,endtime,gmt){
    var locHour = document.getElementById(hour);
    var locMinute = document.getElementById(minute);
    var locSecond = document.getElementById(second);
    if(!endtime){
        console.log(false);
    }else{
        function updateClock(){
            var countDown = getTimeRemaining(endtime,gmt);
        console.log(countDown);// here is the console that output the image above
            if(countDown.total>=0){
                locHour.innerHTML = ('0' + countDown.hours).slice(-2);
                locMinute.innerHTML = ('0' + countDown.minutes).slice(-2);
                locSecond.innerHTML = ('0' + countDown.seconds).slice(-2);
            }else{
                console.log("happend");
                clearInterval(timeinterval);
                initializeClock(hour,minute,second,generateTimerPerPeriod(),gmt);
            }
        }
        updateClock(); // run function once at first to avoid delay
        var timeinterval = setInterval(updateClock,1000);
    }
}

function generateTimerPerPeriod(){
    var schedule = [['00:00:00', '11:59:59'],['12:00:00', '15:59:59'],['16:00:00', '19:59:59'],['20:00:00', '23:59:59']];
    var currentTime = getCurrentDateByGMT(getTimezone('+8'));
    var currentPeriod = new Date(currentTime);
    for(var timeCtr = 0; timeCtr < schedule.length ; timeCtr++){
         var startDate = schedule[timeCtr][0].split(':');
         var endDate = schedule[timeCtr][1].split(':');
         if(currentTime > currentPeriod.setHours(startDate[0],startDate[1],startDate[2],0) && currentTime < currentPeriod.setHours(endDate[0],endDate[1],endDate[2],0)){
            var periodDate = new Date(currentPeriod.setHours(endDate[0],endDate[1],endDate[2],0));
//              console.log(" enddate " +periodDate);
            return periodDate;
         }
    }
    return false;
}

function getCurrentDateByGMT(finalTimezone){
    var myOldDateObj = new Date();
    var myTZO = -480;
    var myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
    console.log(" newdate "+ myNewDate);

    var now = new Date();
    var localTime = now.getTime();
    var finalGMT = now.getTimezoneOffset() - finalTimezone;
    var localOffset =  finalGMT * 60000;  // where 60000 is equals to 1 min
    return new Date(localTime + localOffset);
}

function getTimezone(timezone){
    return timezone * (-60);
}

更新:

这个怎么样?

function getCurrentTimeGMT8(){
    var d = new Date();
    utc = d.getTime() + (d.getTimezoneOffset() * 60000);
    var now = new Date(utc + (3600000*8));
    var hour = addZero(now.getHours());
    var min = addZero(now.getMinutes());
    var sec = addZero(now.getSeconds());
    var tz = "GMT+8";
    var time = hour +':'+ min +':'+ sec + " " + tz;

    return time;
}

【问题讨论】:

  • 大家好,我只是一个关于这个主题的新手,我只是收集信息而不知道更多关于它的信息,所以如果你要对它投反对票,至少考虑删除评论,比如先生。马特谢谢谢谢

标签: javascript date timezone


【解决方案1】:

一些事情:

  1. Date 对象的 getTime 函数始终返回 UTC 格式的值,因此将其称为 localTime 是不正确的。这意味着您的 finalGMTlocalOffset 值也不正确,因为您假设 localTime 值已针对本地偏移量进行了调整,但事实并非如此。你的代码应该是:

  2. 只要您通过更改基础时间戳构造一个新的Date(就像您对new Date(localTime + localOffset) 所做的那样,以及在您创建myNewDate 变量时),您实际上并没有更改时区。您只是将Date 移动到另一个时间点,这可能不是您想要的。 Date 对象将仍然表示当前本地时区的时间,并且仍将遵循当前本地时区的 DST 转换规则。如果您希望它代表其他时区,那可能会妨碍您。

    请注意,您仍然可以通过 Date.now()(或通过 Date.UTC 使用用户输入值)从当前时间计算基于 UTC 的数字时间戳并添加所需的偏移量。除非您希望它反映 local 时区,否则您不能将该时间戳放入 Date 对象中。如果您需要知道该时间戳在本地区域以外的任何其他时区中的年、月、日、小时、分钟、秒,您将需要一个库,例如 moment.js,或者您自己的一些高级算法。

  3. 您询问了有关更改操作系统中的时区的问题。您应该认识到,这种影响在浏览器、版本和操作系统之间是不一致的。许多浏览器(例如 Chrome)在浏览器进程完全终止并重新启动之前不会选择新的时区。但是,某些浏览器(例如 IE)会更新时区而不需要重新启动。如果你需要用户的时区偏移,你不应该缓存它。

  4. 请记住,一个数字只能代表一个偏移量。一个时区可以有多个偏移,要么是由于夏令时,要么是由于其历史的变化。阅读the timezone tag wiki 中的“时区!= 偏移量”。

    在您的情况下,您的倒数计时器仅适用于偏移量。如果这是你的意图,那很好。您当然可以将日期、时间和偏移量作为输入值。只是不要假设从new Date().getTimezoneOffset()当前 偏移量必然是用户时区中ALL 日期和时间的正确偏移量。

【讨论】:

  • 这让事情变得更清楚了,关于 moment.js 它在我们的办公室被阻止所以我不能使用它.. 我真的很想研究更多关于 moment.js 但不幸的是我不能。顺便说一句,感谢您的澄清,我从一开始就知道我只是更改时间而不是时区本身,我一直在寻找更好的解决方案,谢谢谢谢
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多