2017-01-25 3 views
0

Я потратил много времени, пытаясь понять временные интервалы. Но я все еще смущен.Отправить данные в серверном часовом поясе

Дизайн:

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'); 
     }); 
    }, 

ответ

1

Пожалуйста, см измененный код ниже, я использовал минуту манипуляцию особенность расслоения плотной utcOffset поэтому мы можем изменить часовой пояс клиентов даты.

Он даст нам соответствующую дату/время сервера, основанную на дате/времени на клиенте.

getServerTimeZone: функция (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

+0

Я тебя люблю! Спасибо огромное! Как я пропустил это. Большое вам спасибо! – TechnoCorner

+0

im рад, что он решил вашу проблему. – ngeksyo

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. 
+0

Но мои требования были не такими. Я хочу отправить дату/время в часовой пояс «соответствующего» сервера. Не в UTC. Причина, по которой я говорю, заключается в том, что есть cron (на сервере), который работает по местному времени (не UTC) – TechnoCorner

+0

Какой формат даты принимает сервер?Должно по-прежнему работать абсолютно нормально, если сервер хранит даты в формате ISO8601 (неважно, в какое время выполняется задание cron, он будет учитывать разницу в часовом поясе как часть самого задания cron). – richwol

+0

Сервер принимает только локальное время. Сервер не сохраняет даты в формате ISO8601. Возможно ли отправить данные обратно в часовой пояс сервера? – TechnoCorner

Смежные вопросы