在服务器时区问题

时间:2017-01-25 09:30:29

标签: javascript datetime momentjs

我花了很多时间试图了解时区。但我仍然感到困惑。

设计

1)服务器位于与客户端不同的时区。

2)我在API调用中获得了以下信息:

  

/ API /配置/ V1 /系统/时间

{
  "timeZoneOffset": -18000000, (milli sec)
  "serverTimeUTC": 1485332569157,
  "serverTime": "Wed Jan 25 03:22:49 EST 2017",
  "timeZone": "Eastern Standard Time"
}

3)我无权访问服务器。 (不能真正改变那里的任何代码!)

4)我在客户端有完整的访问权限。 (JavaScript)的

问题/需求:

  • 我想花时间(PST,CST等)并在相应的服务器时间内发送它。 (无论服务器处于什么时区)(不一定是UTC)。

我的代码:

我尝试了以下但仍然困惑于我要去的地方:

    getServerTimeZone: function(newTime){

        var _this = this;
        $.ajax({
            url: '/api/config/v1/system/time'
        })
        .done(function(data) {
            if(!newTime){
                newTime = new Date();
            }
            //Get Server Timezone and offset
            //Offset is in milli sec. Converting it to hours
            var serverTimeOffset = data.timeZoneOffset / (60 * 60 * 1000);

            // Get current timezone offset for host device
            var x = new Date();
       var clientCurrentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

            //Calculate the difference
            var actualOffset = Math.abs(clientCurrentTimeZoneOffsetInHours - serverTimeOffset);

            //Format actual time in relative to server time
            serverTime = moment.utc(newTime).zone(actualOffset).format('MM/DD/YYYY h:mm A');
        });
    },

2 个答案:

答案 0 :(得分:1)

请参阅下面修改后的代码,我使用了时刻js操作功能utcOffset,以便我们可以更改客户日期的时区。

它将根据客户端上的日期/时间向我们提供相应的服务器日期/时间。

getServerTimeZone:function(newTime){

var _this = this;
$.ajax({
    url: '/api/config/v1/system/time'
})
.done(function(data) {
    if(!newTime){
        newTime = new Date();
    }
        //Get Server Timezone and offset
        //Offset is in milli sec. Converting it to hours
        var serverTimeOffset = data.timeZoneOffset / (60 * 60 * 1000);

        // Get current timezone offset for host device
        var x = new Date();
        var clientCurrentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

        // change the timezone using utcOffset
        serverTime = moment(x).utcOffset(serverTimeOffset).format('MM/DD/YYYY h:mm A');
    });

},

你可以在这里测试,我使用-5偏移。

https://jsbin.com/puvutevomo/edit?html,js,output

答案 1 :(得分:0)

如果我正确理解了要求,则您不应该将任何时区特定信息发送到服务器。当日期/时间以ISO8601格式给出(并且末尾有x)时,它是UTC格式。此时的时区是无关紧要的,仅用于显示目的。

时刻会自动在用户正确的时区显示该日期/时间(基于浏览器设置)。

var d = moment('2016-01-01T00:00:00.000Z');
console.log(d.format('llll')); //This will output the date/time relative to the user's timezone automatically

var sendToServer = d.toISOString() //send this string up to the server. It is in UTC format.