Преобразование даты и времени JSON в C # и игнорирование часового пояса? - PullRequest
0 голосов
/ 12 марта 2019

У меня есть scenerio, где пользователь вводит дату (например, 30.11.2008) с угловой.Когда я анализирую эту дату из json в c #, она появляется как 30.11.2008 г. в 4:00 или в любом другом часовом поясе.Это хорошо, если я нахожусь в часовом поясе, который -UTC, как в Америке.Если у меня есть пользователь в Индии или Японии, он конвертируется в 29.11.2008 5:30.Что НЕ хорошо.

Как я могу преобразовать json и сохранить дату, которую ввел пользователь, независимо от того, в каком часовом поясе он находится?

Если пользователь вводит 30.11.2008 в Калифорнии и пользователь вводит 30.11.2008 в Японии, конечный результат должен быть 30.11.2008 0:00 в обоих сценариях

это мой код конверсии ниже

 strChangedData = [{\"EndDt\":\"2018-11-30T04:00:00.000Z\"}]

List<MyModel> objMyModel = (List<MyModel>)Newtonsoft.Json.JsonConvert.DeserializeObject(strChangedData, 
                           typeof(List<MyModel>), GetJsonSettings());  

public static JsonSerializerSettings GetJsonSettings()
        {
            var settings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.IsoDateFormat,
                DateTimeZoneHandling = DateTimeZoneHandling.Utc,
                DateParseHandling = DateParseHandling.DateTime
            };

            return settings;
        }

Ответы [ 4 ]

0 голосов
/ 15 марта 2019

Если ваш пользователь выбрал дату, вы не должны отправлять обратно дату, время и смещение часового пояса. Просто отправьте дату:

{"EndDt":"2018-11-30"}

Тогда вам не нужно изменять какие-либо настройки даты в анализаторе Json по умолчанию.

Обратите внимание, что если ваш пользовательский интерфейс использует <input type="date">, он уже передан вам в свойстве value . Вы не должны создавать объект JavaScript Date из значения.

Если, однако, вы используете какой-то другой элемент управления выбора даты, который возвращает только объект Date, то вам потребуется извлечь из него местный год, месяц и дату, чтобы построить возвращаемую строку. Библиотеки, такие как Moment.js , могут помочь, а некоторые средства выбора даты изначально работают с Moment.

Пожалуйста, предоставьте больше информации о вашем сборщике дат, если вы хотите получить более конкретный совет в этом отношении.

0 голосов
/ 12 марта 2019

Вы можете добиться успеха с IsoDatetimeConverter. Я бы попробовал что-то вроде этого:

var isoDateConverter = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" };

var objMyModel = JsonConvert.DeserializeObject<List<MyModel>>(strChangedData, isoDateConverter); 
0 голосов
/ 15 марта 2019

На самом деле дважды проверьте ваши даты, поступающие из вашего кода JSON. Я чувствую, что они, возможно, уже были преобразованы в javascript.

Также измените jsonsettings на

public static JsonSerializerSettings GetJsonSettings()
        {
            var settings = new JsonSerializerSettings
            {
                DateFormatHandling = DateFormatHandling.IsoDateFormat,
                DateTimeZoneHandling = DateTimeZoneHandling.Local,
                DateParseHandling = DateParseHandling.DateTime
            };

            return settings;
        }
0 голосов
/ 12 марта 2019

Возможно, вы хотите, чтобы MyModel использовал DateTimeOffset, если он в данный момент использует DateTime.Вы можете получить дату, используя .ToShortDateString(), но возможно, что вы случайно измените дату, если пользователь находится в другом часовом поясе, если вы не используете DateTimeOffset.

Вот пример: https://dotnetfiddle.net/OA06L9

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