Проблема при форматировании даты в С#

Я передаю значение TextBox DateTime в Entity Model в API и форматирую дату и время в CultureInfo («en-GB», true) при сохранении данных в базе данных.

Он показывает день как месяц и месяц как дату.

Вот мой код:

IFormatProvider FormatDate = new System.Globalization.CultureInfo("en-GB", true);

Convert.ToDateTime(user.DOB, FormatDate);

Я передаю дату «08-04-2019» в формате дд-мм-гггг в user.DOB через API.

user.DOB, показывающий день = 4 и месяц = ​​8 вы можете проверить это на изображении ниже...

Проблема при форматировании даты в С#

Итак, DOB — это строка?

Erik Philips 09.04.2019 11:57

используйте DateTime.Parse или DateTime.ParseExact

TheGeneral 09.04.2019 11:57

@ErikPhilips нет, DOB - это DateTime

Shreyas Pednekar 09.04.2019 12:04

Возможный дубликат DateTime и информация о культуре

Ian Preglo 09.04.2019 12:12

@ЯнП. Нет, мой вопрос в другом. День и месяц отображались неправильно после форматирования.

Shreyas Pednekar 09.04.2019 12:19

Лучше всего передавать дату в формате UTC, а затем использовать параметр в запросе на вставку/обновление. Чтобы вы всегда работали с одним и тем же форматом. База данных заботится о своей культуре. То же самое для текстового поля.

Lorenzo Isidori 09.04.2019 12:21

@ShreyasPednekar Предоставленный код работает, как и ожидалось. Можете ли вы подтвердить, что ввод является строкой, его значение соответствует вашим ожиданиям?

Kami 09.04.2019 12:26

Является ли user.DOB объектом DateTime или строкой? Если это уже DateTime, то почему вы используете метод Convert.ToDateTime()?

jdweng 09.04.2019 13:11

@Kami да, ввод представляет собой строку, и она поступает из приложения angular через API

Shreyas Pednekar 10.04.2019 08:45

@jdweng user.DOB уже является DateTime, но я хотел отформатировать его в CultureInfo («en-GB», true) при вставке записи в базу данных.

Shreyas Pednekar 10.04.2019 08:46

То, что вы сделали, абсолютно ничего не делает. Форматирование не сохраняется в переменной. DateTime хранится в виде числа, где вся часть числа представляет собой номер дня с 01.01.1, а дробь — часть 24 часов (0,25 — 6 часов, 0,5 — 12 часов и 0,75). составляет 18 часов). Изменение культуры, вероятно, меняет часовой пояс, что повлияет на часы и может привести к изменению дня.

jdweng 10.04.2019 10:41

@jdweng Хорошо, тогда скажи мне, почему DateTime.Parse(user.DOB.ToString(), FormatDate) показывает правильный день и месяц, но Convert.ToDateTime(user.DOB, FormatDate) показывает день и месяц местами?

Shreyas Pednekar 10.04.2019 10:56

С чего вы начали? Если бы вы не конвертировали, у вас не было бы никаких проблем. Преобразование из строки в DateTime использует локальные настройки компьютера (включая культуру). Ваш код мог переопределять локальные настройки, если вы запускали код в США, но данные были собраны в Англии. Если бы вы не конвертировали в первую очередь, не было бы никаких проблем, потому что дата была бы сохранена как число в UTF.

jdweng 10.04.2019 11:44

@ShreyasPednekar См. - docs.microsoft.com/en-us/dotnet/api/… . Если предоставленное значение является DateTime, то возвращается указанный объект DateTime; фактическое преобразование не выполняется. Какой результат вы ожидаете от этой функции? user.DOB.ToString("dd/MM/yyyy") будет недостаточно?

Kami 10.04.2019 11:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы также можете сделать что-то подобное.

var mydate = new DateTime(1976, 10, 13);

Не уверен, как это помогает, ОП спрашивает о замене даты и месяца при разборе даты!

phuzi 09.04.2019 14:19
Ответ принят как подходящий

Я решил свою проблему с помощью

преобразование public DateTime DOB { get; set; } в public string DOB { get; set; } в DTO

затем преобразуется в DateTime с форматом en-GB, а это в процедуру сохранения

IFormatProvider FormatDate = new System.Globalization.CultureInfo("en-GB", true);

Convert.ToDateTime(user.DOB, FormatDate);

Другие вопросы по теме