Как конвертировать Date из машинописного текста в c # и обратно с правильным часовым поясом? - PullRequest
0 голосов
/ 07 июля 2019

Я использую angularx-flatpickr для выбора даты со временем.
Мой местный часовой пояс +2.

Я выбираю эту дату: '10 .07.2019 12: 00 '
В консоли JS я получаю: Ср 10 июля 2019 12:00:00GMT + 0200 (Mitteleuropäische Sommerzeit)
В сообщении API я вижу объект JSON со временем = 2019-07-10T10: 00: 00.000Z
В c # я использую систему.DateTime и я получаю объект DateTime с: {10.07.2019 10:00:00}
В базе данных хранится: 10.07.2019 10: 00: 00
Вернувшись в JS при запросе данных, я использую модель представления с типом Date.Но объект из модели представления является строкой "2019-07-10T10: 00: 00" .
Так что теперь я могу использовать new Date ("2019-07-10T10: 00: 00 ") для преобразования в JS Date.Но время сейчас неправильное из-за часового пояса: ср. 10 июля 2019 10:00:00 GMT + 0200 (Mitteleuropäische Sommerzeit)

Я думаю, что имеет смысл хранить UTC DateTimeв базе данных.
Так что это означает, что мне нужно преобразовать время в JS в правильный часовой пояс от пользователя.Какова лучшая практика для этого?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Было бы более полезно добавить код к вашему вопросу , чтобы мы могли видеть, как ваш код работает сквозным . Тем не менее, я думаю, из вашего описания я могу определить проблему:

Вернувшись в JS при запросе данных, я использую модель представления с типом Date. Но объект из модели представления представляет собой строку "2019-07-10T10:00:00".

Где-то в вашем коде вы загружаете значение из базы данных обратно в DateTime объект. Например, если вы используете DataReader для загрузки ваших данных, вы можете делать что-то вроде этого:

DateTime dt = (DateTime) someDataReader["@TheDateTimeDBField"];

При этом полученное значение будет иметь свойство Kind, установленное на DateTimeKind.Unspecified. Это позже заставляет сериализацию не включать какую-либо информацию о смещении.

Ваш код не имеет никакой информации, чтобы сказать, что значения в вашей базе данных указаны в UTC. Со значениями DateTime вы должны сделать это явно после загрузки:

DateTime dt = (DateTime) someDataReader["@TheDateTimeDBField"];
dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);

Это установит для свойства Kind значение DateTimeKind.Utc, которое позже будет сериализовано с добавленным Z. (Это работает, потому что формат даты по умолчанию в JSON.Net включает спецификатор K ).

В качестве альтернативы рассмотрите возможность использования значений DateTimeOffset как в коде .NET, так и в базе данных (при условии, что MS SQL Server). Затем значения будут сохранены и сериализованы со смещением. Он будет использовать +00:00 вместо Z, но будет иметь тот же эффект.

0 голосов
/ 08 июля 2019

Кажется, что почти все правильно в вашем подходе.Ошибка возникает на шаге, когда вы получаете дату из БД и отправляете ее в JS в строковом формате.Дата отправки: "2019-07-10T10: 00: 00" .И это обозначает дату в местном часовом поясе, так как в конце ей не хватает символа Z .Поэтому добавьте символ Z в конец, и вы получите дату в часовом поясе UTC.Поэтому строка

new Date("2019-07-10T10:00:00Z")

приведет к времени Ср. 10 июля 2019 12:00:00 GMT + 0200 (Mitteleuropäische Sommerzeit)

Рекомендую добавить Z на стороне C #, поэтому дата передается в JS в правильном формате.

Подробную информацию о форматах даты в JS можно найти здесь .

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