通过更改系统(pc)时钟

时间:2015-09-11 10:49:34

标签: javascript date timezone

大家好需要帮助,

这是我的代码

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

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

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

刷新浏览器后,它恢复正常倒计时而不更改时区。

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

另外,有人可以再向我解释一下

image attached

更新:

好的,这是我的完整代码

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

1 个答案:

答案 0 :(得分:1)

一些事情:

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

  2. 任何时候通过更改基础时间戳来构建新的Date(就像使用new Date(localTime + localOffset)一样,以及创建myNewDate变量时),你就是实际上并没有改变时区。您只是将Date移动到不同的时刻,这可能不是您想要的那个。 Date对象将仍然表示当前本地时区的时间,并且仍将遵循当前本地时区的DST转换规则。如果您打算代表某个其他时区,那可能会妨碍您。

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

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

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

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