在过去的几天里,我一直在试图解决这个问题,但只是因为它而失去了头发。
我正在使用下面的javascript作为计时器,该计时器使用时间戳作为开始日期进行计数。我正在使用数据库中的时间戳,该时间戳在计时器启动时保存,因为该时间戳是相对于用户的时区保存的,该时区是在他们的个人资料中选择的。
我的服务器 php 时区设置为“America/Los_Angeles”。我的用户个人资料时区也设置为此。这也是保存时区的格式。
但是,当我运行计时器时,即使我的 php 根据保存的时区显示正确的保存时间,即。'05/29/2013 6:05:49',计时器从一开始就有额外的时间。所以它看起来像“0 天 12 小时 0 分钟 13 秒”而不是“0 天 0 小时 0 分钟 13 秒”。
这一定是由于 javascript 时区所致?因为如果我将 TZ 设置为“America/New_York”,例如,它将是“0 天 9 小时 0 分钟 13 秒”,对吗?
我将如何解决这个问题?
JS
<script type="text/javascript">
function DaysHMSCounter(initDate, id){
this.counterDate = new Date(initDate);
this.container = document.getElementById(id);
this.update();
}
DaysHMSCounter.prototype.calculateUnit=function(secDiff, unitSeconds){
var tmp = Math.abs((tmp = secDiff/unitSeconds)) < 1? 0 : tmp;
return Math.abs(tmp < 0 ? Math.ceil(tmp) : Math.floor(tmp));
}
DaysHMSCounter.prototype.calculate=function(){
var secDiff = Math.abs(Math.round(((new Date()) - this.counterDate)/1000));
this.days = this.calculateUnit(secDiff,86400);
this.hours = this.calculateUnit((secDiff-(this.days*86400)),3600);
this.mins = this.calculateUnit((secDiff-(this.days*86400)-(this.hours*3600)),60);
this.secs = this.calculateUnit((secDiff-(this.days*86400)-(this.hours*3600)-(this.mins*60)),1);
}
DaysHMSCounter.prototype.update=function(){
this.calculate();
this.container.innerHTML =
" <strong>" + this.days + "</strong> " + (this.days == 1? "day" : "days") +
" <strong>" + this.hours + "</strong> " + (this.hours == 1? "hour" : "hours") +
" <strong>" + this.mins + "</strong> " + (this.mins == 1? "min" : "mins") +
" <strong>" + this.secs + "</strong> " + (this.secs == 1? "sec" : "secs");
var self = this;
setTimeout(function(){self.update();}, (1000));
}
window.onload=function(){ new DaysHMSCounter('05/29/2013 6:05:49', 'timer'); }
</script>
HTML
<div id="timer"></div>