我有一个函数,在该函数中,我将根据澳大利亚新南威尔士州时区减去本地偏移量来计算当前用户位置时间。因此,例如,我想将澳大利亚(新南威尔士州)当地时间的事件开始时间与我的当地时间进行比较,如果我在本地主机上打开网站,我会得到正确的值。然而,如果我访问上传服务器上的网站(测试环境),我会有1个小时的不同。因此,如果本地主机上的正确时间是04:00,那么在测试环境中我将得到05:00。
这是我的功能:
var date = {
formatFullDate: function(date, gmtTimeOffset) {
var localDate = this.getLocalTimeFromAustraliaTime(date, gmtTimeOffset),
month = this.addZeroToFront(localDate.getMonth() + 1),
hour = this.addZeroToFront(localDate.getHours()),
minute = this.addZeroToFront(localDate.getMinutes());
return localDate.getDate() + '/' + month + '/' + localDate.getFullYear() + ' ' + hour + ':' + minute;
},
formatTime: function(date, gmtTimeOffset) {
var localDate = this.getLocalTimeFromAustraliaTime(date, gmtTimeOffset),
hour = this.addZeroToFront(localDate.getHours()),
minute = this.addZeroToFront(localDate.getMinutes());
return hour + ':' + minute;
},
addZeroToFront: function(whatever) {
if (whatever < 10) whatever = "0" + whatever;
return whatever;
},
getUTCtimeOffset: function() {
var date = new Date();
return date.getTimezoneOffset();
},
getLocalTimeFromAustraliaTime: function (date, gmtTimeOffset) {
var gmtTime = new Date(date.getTime() - gmtTimeOffset*1000),
localOffset = new Date().getTimezoneOffset(),
localDate = new Date(gmtTime - localOffset*60*1000);
return localDate;
}
}
我的具体案例的一些一般细节:
Aus/NSQ时区:UTC/GMT+10小时
芬兰时区:UTC/GMT+3小时
因此,澳大利亚/新南威尔士州和芬兰之间有7个小时的差异,结果正确显示在localhost上,但没有显示在测试环境上。我不知道为什么这两种情况相差1个小时。
编辑:1
这就是我显示当前本地时间的方式
var tr = $('<tr style="cursor:pointer; color: #000000" id="' + categoryId + '_' + raceNumber + '_nextRaceTr"/>')
.append($('<td/>')
.append($('<p/>')
.html(date.formatTime(new Date(value.time), value.timezoneOffset))))
其中as time和timezoneOffset是JSON响应。
附言-如果我遗漏了括号或任何其他语法错误,请不要注意。我只复制了一小段代码,只是为了展示我如何在HTML上显示时间。
JavaScript Date
对象总是受到运行环境的时区设置的影响。在大多数情况下,这是用户的浏览器。不同时区的用户运行您的代码会得到不同的结果。
一般来说,您应该注意任何遵循以下模式的代码:
var adjustedDate = new Date(someOtherDate.getTime() - someOffset);
您可能认为您在巧妙地将Date
对象的行为调整到不同的时区,但实际上您正在更改引用的时间点,并保持时区不变!
此外,考虑一下你在哪里:
var localOffset = new Date().getTimezoneOffset();
您可能认为您得到的是用户的时区偏移量,但实际上您只是得到用户的当前时区偏移量。请记住,new Date()
初始化为当前时刻。您使用的时间可能有完全不同的偏移量,这取决于用户是否碰巧在夏令时时区,以及当时是否有效。
就您的代码而言,由于您没有给出输入的示例,因此很难判断您想要的是什么。你可能想看看moment.js,它拥有你可能想要的大部分格式化功能。
顺便说一句,我在你的代码中没有看到任何东西能真正将它绑定到任何澳大利亚时区。
我建议您将所有时间转换为UTC并以该格式存储。当您为用户显示时间时,您可以从UTC转换为他们的本地时间。只需确保您在要显示时间的同一台机器上进行所有计算/转换(例如,如果您在网页中显示日期,请不要在服务器上计算本地时间,向浏览器发送epoch时间戳,然后使用JavaScript将其转换为本地时间)。
var d = new Date(1413409549000);
alert(d.toString());