2015-04-25 4 views
2

Приложение работает на localhost. Сервер на час раньше, чем клиент!Почему существует разница во времени между клиентом и сервером на localhost

Клиент посылает время: Sat Apr 25 2015 00:00:00 GMT-0400 (Eastern Daylight Time)

enter image description here

Запрос отсылается: dateOfArrival: "2015-04-25T04:00:00.000Z"

enter image description here

Сервер получает время: {4/24/2015 11:00:00 PM}

enter image description here

Почему разница в часах между и как я могу справиться с этим? Я мог догадаться, что это как-то связано с дневным временем и стандартным временем.

Когда я пытаюсь этот код:

string dateStr = "2015-04-25T04:00:00.000Z"; 
var myDate = DateTime.Parse(dateStr); // it gives me myDate = {4/25/2015 12:00:00 AM} 

На самом деле я заинтересован только день часть времени. В моем db я держу его как тип Date. Но из-за этой разницы во времени мои дни идут за день до этого.

Я пробовал различные способы справиться с проблемой, но я полностью потерялся в мире конверсии даты и времени! Даже я теряюсь в приложении localhost, я не мог себе представить, что произойдет на реальном сервере.

Я думаю this Q&A также упоминает подобный вопрос, но я не могу понять его , если это имеет значение:

Мой часовой пояс: Eastern Time Zone (UTC-05: 00)

О веб-апи OData сериализатору JSON, from this post я мог бы сказать, что это другой, то this one

Вот мой код сервера:

// PATCH: odata/IncomingStudents(5) 
[AcceptVerbs("PATCH", "MERGE")] 
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<IncomingStudent> patch) 
{ 
    Validate(patch.GetEntity()); 
    var dateOfArrival = patch.GetEntity().DateOfArrival 
... 
} 

Клиент отправляет http-запрос http-запроса

ответ

1

Чтобы избежать разницы в часовом поясе между клиентом и сервером (или различными конфигурациями на одном компьютере), вы, вероятно, захотите использовать UTC для любых передач и для его хранения в базах данных.

Ожидает подтверждения Обратите внимание, что на серверной стороне вам может потребоваться DateTime.ToUniversalTime(), чтобы уточнить дату, или DateTime.UtcNow, чтобы получить текущую дату & раз.

Из javascript может быть хорошей идеей использовать moment.js, чтобы облегчить обработку дат.

используя момент.JS, вы можете получить значение в UTC следующим образом:

var localDate = new Date(); 
var inUtc = moment(localDate).utc(); 

Вы хотите отобразить информацию пользователю в его локальное смещение, но всегда посылает на сервер и получить обратно, используя UTC.

0

Код сервера работает как в пользовательском контексте пользователя в пуле APP.
Скрипт java в клиентских браузерах определяет часовой пояс.

Эти временные интервалы могут отличаться.

1

Тайна решена:

Значение dateOfArrival в БД: 2015-04-25 (дата только)
сервер принимает это значение делает его: 2015-04-24T23: 00: 00-05: 00

у клиента, новая дата (dateOfArrival) дает 2015-04-25T04: 00: 00.000Z
отправить это значение на сервер и сервер делает его 4/24/2015 11:00:00 PM

Сервер получает одинаковое значение.

Как указано в this post, если дата не находится в диапазоне дневного светового времени, такого как 01/01/2015, все даты были бы одинаковыми.

С другой стороны, поскольку я работаю с веб-api odata, так как он работает только с DateTimeOffset, но не с DateTime. Я думаю, что возникают эти проблемы с часовым поясом