Получить текущую дату моего часового пояса - PullRequest
0 голосов
/ 21 мая 2018

У меня есть этот код, который отображает разные результаты на моей локальной машине разработки и на моем размещенном сайте:

JavaScriptSerializer js = new JavaScriptSerializer();
TimeZoneInfo nzZone = TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time");
litUTC.Text = DateTime.UtcNow.ToString() + " " + js.Serialize(DateTime.UtcNow) + " " + js.Serialize(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, nzZone));

На моей локальной машине он отображал:

21/05/2018 2: 15: 24 AM "/ Дата (1526868924867) /" "/ Дата (1526868924867) /"

Однако на моем размещенном сайте отображалось:

21/05/2018 2:16: 01:00 "/ Дата (1526868961581) /" "/ Дата (1526930161581) /"

Есть идеи, почему на размещенном сайте стало 1526930161581?Это большой разрыв между двумя.В результате это стало 22/05/2018, когда я преобразовал его обратно в формат даты.Я перевел оба из UtcNow одинаково в свой текущий часовой пояс, они должны быть одинаковыми или на пару секунд разными.Спасибо

1 Ответ

0 голосов
/ 21 мая 2018

Проверьте часовой пояс на сервере, на котором работает размещенный сайт.Это не новозеландское стандартное время.Разница:

1526868961581 - 1526930161581 = 61200000 миллисекунд (17 часов)

А поскольку стандартное время Новой Зеландии равно +12, оно выглядит как часовой пояссервер -5, который является восточным временем.Похоже, сервер расположен в США (или Канаде).

Обратите внимание, что когда JavaScriptSerializer сериализует даты, он сначала преобразует их в UTC.Затем он вычисляет миллисекунды эпохи Unix и помещает результат в /Date()/.Поэтому не используйте UtcNow и сериализуйте свои даты напрямую, как js.Serialize(DateTime.Now).Когда вы используете значение миллисекунды в конструкторе new Date() в JavaScript, оно принимает его в формате UTC и преобразует его в местное время, используя часовой пояс браузера.

Ниже приведено описание из MSDN :

Microsoft ASP.NET AJAX [...] кодирует значения .NET DateTime в виде строки JSON, где содержимое строки равно / Date (ticks) / и где отмечены меткипредставляет миллисекунды с начала эпохи (UTC).Поэтому 29 ноября 1989 года, 4:55:30 утра, в UTC кодируется как "/Date(628318530718)/".

JavaScriptSerializer имеет некоторые проблемы, и сериализация /Date()/был создан Microsoft и не является стандартом.Вместо этого рекомендуется использовать библиотеку, которая поддерживает стандарт ISO (например, Newtonsoft.Json).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...