Я хочу вернуть результат Json, содержащий дату и время, запрошенные из базы данных. Тестирование на моем локальном компьютере прошло без проблем, однако после публикации на рабочем сервере все даты и время отображаются на 3 часа вперед. Я предполагаю, что это связано с тем, что сервер находится в другом часовом поясе.
Нужна помощь в решении этой проблемы.
Данные в базе данных (MS SQL):
StartDt: 2019-07-02 04:00:00.000
Контроллер.cs:
[HttpGet]
public ActionResult GetAll()
{
CalendarModel calendarModel = new CalendarModel();
var calendarEvents = from cal in db.Calendar
orderby cal.created descending
select cal;
return Json(calendarEvents, JsonRequestBehavior.AllowGet);
}
Результат Json получен с моего компьютера:
[
{
//some data
"startDt": "/Date(1562054400000)/",
//some data
},
Приведенная выше дата и время анализируется как «2019-07-02T04:00:00.000-04:00», что правильно.
Результат Json получен с рабочего сервера (запрошен из той же базы данных):
[
{
//some data
"startDt": "/Date(1562065200000)/",
//some data
},
Это дата и время «2019-07-02T07:00:00.000-04:00», что неверно.
--------Обновите мое решение-------
Спасибо, ответ @TommasoBertoni
вдохновил меня на то, что основная причина этой проблемы связана с типом Unspecified
DateTime по умолчанию, но во время сериализации Json становится local
. Поэтому просто нужно установить тип DateTime на UTC
, чтобы решить эту проблему, но имейте в виду, что синтаксический анализ DateTime во внешнем интерфейсе также должен принимать его как UTC
, иначе он будет считаться local
по умолчанию.
Контроллер.cs:
[HttpGet]
public ActionResult GetAll()
{
CalendarModel calendarModel = new CalendarModel();
var calendarEvents = from cal in db.Calendar
orderby cal.created descending
select cal;
//Add this
foreach (var item in calendarEvents)
{
item.startDt = DateTime.SpecifyKind(item.startDt, DateTimeKind.Utc);
}
return Json(calendarEvents, JsonRequestBehavior.AllowGet);
}
.js (с использованием библиотеки moment.js
)
//parse it as utc
moment.utc(startDt).format("YYYY-MM-DDTHH:mm:ss")
Date
в объект даты и откуда вы получаете свою дату (2019-07-02T07:00:00.000-04:00) на стороне клиента? Это похоже на представление даты для часового пояса UTC-4, поэтому ваша оценка2019-07-02T04:00:00.000-04:00
верна кажется неверной. - person Liam   schedule 18.07.2019/Date(...)/
нет такой вещи, как просто 4 утра. Он представляет собой момент во времени. Какой момент вас интересует? Этот момент времени может быть 4 утра в некоторых местах и 7 утра в других местах.Вы действительно пытаетесь представить момент времени или местную дату/время, которые будут означать разные моменты времени в разных часовых поясах? - person Jon Skeet   schedule 18.07.2019Kind
дат, полученных из базы данных? (date.Kind
) это может бытьUnspecified
,Local
илиUtc
. Это должно помочь нам понять, происходит ли преобразование во время выборки значений или во время сериализации json. - person Tommaso Bertoni   schedule 18.07.2019Unspecified
- person Lei.L   schedule 18.07.2019Postman
- person Lei.L   schedule 18.07.2019