getTimezoneOffset()方法在localhost和服务器上返回不同的时间

时间:2014-04-16 14:25:13

标签: javascript jquery datetime timezone-offset

我有一个功能,我根据澳大利亚新南威尔士州时区减去当地偏移计算当前用户的位置时间。因此,例如,我想比较澳大利亚(新南威尔士州)当地时间的事件开始时间与我当地时间的比较,如果我在本地主机上打开网站,我将获得正确的值。但是,如果我访问上传服务器(测试环境)上的网站,我会得到1小时的不同。因此,如果localhost上的正确时间是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小时

因此,AUS / NSW和芬兰之间有7个小时的不同,结果在localhost上正确显示,但在测试环境中没有。我不确定为什么这2个案例之间有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))))

time和timezoneOffset是JSON响应的位置。

P.S - 如果我遗漏括号或任何其他语法错误,请不要注意。我只复制了一小段代码,以显示我如何在HTML上显示时间。

2 个答案:

答案 0 :(得分:2)

JavaScript Date对象始终受其运行环境的时区设置的影响。在大多数情况下,这是用户的浏览器。不同时区的用户将获得运行代码的不同结果。

通常,您应该注意遵循以下模式的任何代码:

var adjustedDate = new Date(someOtherDate.getTime() - someOffset);

您可能认为自己巧妙地将Date对象的行为调整到了不同的时区,但实际上您正在更改引用的时间点并使时区保持不变!

另外,请考虑您的位置:

var localOffset = new Date().getTimezoneOffset();

您可能认为您正在为用户获取时区偏移量,但实际上您只是为用户获取当前时区偏移量。请注意,new Date()会及时初始化为当前时刻。您正在使用的那一刻可能会有完全不同的偏移量,具体取决于用户是否恰好位于daylight saving time的时区,以及当时是否生效。

就您的代码而言,由于您没有提供您的输入示例,因此很难说出您之后的情况。您可能需要查看moment.js,其中包含您可能正在寻找的大部分格式化功能。

顺便说一句 - 我在代码中看不到任何会将其绑定到任何Australian time zones的内容。

答案 1 :(得分:0)

我建议您将所有时间转换为UTC并以该格式存储。为用户显示时间时,可以从UTC转换为本地时间。只需确保在要显示时间的同一台计算机上进行所有计算/转换(例如,如果您在网页上显示日期,请不要计算服务器上的本地时间,请发送一个将纪元时间戳添加到浏览器,然后使用JavaScript将其转换为本地时间。

&#13;
&#13;
var d = new Date(1413409549000);
alert(d.toString());
&#13;
&#13;
&#13;