大家好需要帮助,
这是我的代码
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
但每当我改变计算机时区时,倒计时也会改变。
刷新浏览器后,它恢复正常倒计时而不更改时区。
我想知道为什么有人可以帮我这个?在此先感谢您的语法修正,欢迎您编辑此问题,谢谢。
另外,有人可以再向我解释一下
更新:
好的,这是我的完整代码
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;
}
答案 0 :(得分:1)
一些事情:
getTime
对象的Date
函数始终返回UTC的值,因此调用它localTime
是不正确的。这意味着您的finalGMT
和localOffset
值也不正确,因为您假设localTime
值已针对本地偏移量进行了调整,但事实并非如此。您的代码应该是:
任何时候通过更改基础时间戳来构建新的Date
(就像使用new Date(localTime + localOffset)
一样,以及创建myNewDate
变量时),你就是实际上并没有改变时区。您只是将Date
移动到不同的时刻,这可能不是您想要的那个。 Date
对象将仍然表示当前本地时区的时间,并且仍将遵循当前本地时区的DST转换规则。如果您打算代表某个其他时区,那可能会妨碍您。
请注意,您仍然可以通过Date.now()
(或通过Date.UTC
用户输入值)从当前时间计算基于UTC的数字时间戳,并添加所需的偏移量。您不能再使用该时间戳并将其放在Date
对象中,除非您打算反映本地时区。如果您需要知道除本地区域之外的任何其他时区的时间戳的年,月,日,小时,分钟,秒,您需要一个库,例如moment.js或您的一些高级算法自己的。
您询问有关更改操作系统中的时区的信息。您应该认识到,这种影响在浏览器,版本和操作系统之间是不一致的。在浏览器进程完全终止并重新启动之前,许多浏览器(例如Chrome)都不会选择新的时区。但是,某些浏览器(如IE)将更新时区而无需重新启动。如果您需要用户的时区偏移量,则不应将其缓存。
请注意,数字只能代表偏移量。 时区可以有多个偏移量,可能是由于夏令时,也可能是由于其历史记录的变化。请阅读the timezone tag wiki中的“时区!=偏移”。
在您的情况下,倒数计时器仅适用于偏移。如果这是你的意图,那很好。您当然可以将日期,时间和偏移量作为输入值。只是不要假设new Date().getTimezoneOffset()
的当前偏移量必然是用户时区中所有日期和时间的正确偏移量。