Преобразование даты из формата 05.06.2020 в формат дд/мм/гггг

Я столкнулся с небольшой проблемой, с которой я не могу справиться после стольких попыток, так что вот оно..... На моей странице есть текстовое поле, в которое я ввожу дату, и я хочу, чтобы эта дата была в объекте даты и времени.

например: date entd: 6 05 2020 (dd/MM/yyyy) должен быть в том же формате, когда я обращаюсь к нему в объекте даты и времени, но он изменяется на (6.05.2020, т.е.: формат MM/dd/yyyy).

я надеюсь, что я имею смысл здесь, все, что я хочу, это что-то вроде этого .....

DateTime dt = convert.ToDateTime(txtDate.Text);

dt должно быть (02.11.2010, а не 11.02.2010)

@oded после использования следующего кода

DateTime sDate, eDate = new DateTime(); 

//Чтобы изменить даты для нашего использования. DateTime.TryParseExact(txtFrom.Text, "дд/мм/гггг", CultureInfo.InvariantCulture, DateTimeStyles.None, вне sDate);

DateTime.TryParseExact(txtFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); 

Что я получаю в edate и sdate: 6 05 2020 00:00:00, где должно быть 05/06/2020.


person ankur    schedule 06.10.2011    source источник
comment
Я не уверен, что ты имеешь в виду. Объект DateTime не должен иметь формат, за исключением того, что он имеет реализацию ToString(). Вы должны иметь возможность отображать его так, как вам нравится.   -  person kmkemp    schedule 06.10.2011
comment
Почему бы не использовать CalenderExtender с таким форматом, как этот CalenderExtender1.Format = "dd.MM.yyy"; из AjaxControlToolkit? Я не думаю, что безопасно вводить дату, пользователи могут вводить что-либо, кто не знает, как работает ваше текстовое поле даты.   -  person Bastardo    schedule 06.10.2011
comment
Если вы получаете 1/1/0001/, это означает, что анализируемый текст недействителен. Я бы просто использовал CalenderExtender, потому что то, что вы хотите сделать, потребует много работы, чтобы оно того стоило.   -  person Security Hound    schedule 06.10.2011


Ответы (5)


РЕДАКТИРОВАТЬ: Это значение: «11/2/2010» не соответствует формату «дд/мм/гггг». Соответствует формату «д/м/гггг» — для «дд/мм/гггг» должно быть «02.11.2010».

Вот почему TryParseExact терпит неудачу для вас. Вам нужно выбрать правильный шаблон формата.


Значение DateTime не имеет формата. Он просто представляет дату и время (в календаре ISO и, возможно, в разных часовых поясах, но это другое дело). Это похоже на int — оно не представляет «десятичное целое» или «шестнадцатеричное целое» — это просто целое число в определенном диапазоне. Вы можете отформатировать число как десятичное или шестнадцатеричное, но оно по своей сути не имеет формата.

Похоже, вы должны проанализировать его с помощью ParseExact, чтобы указать формат при преобразовании из текстового поля или, возможно, TryParseExact:

// This is assuming you're absolutely sure of the format used. This is *not*
// necessarily the user's preferred format. You should think about where your
// data is coming from.
DateTime date;
if (DateTime.TryParseExact(text, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out date))
{
    // Okay, successful parse. We now have the date. Use it, avoiding formatting
    // it back to a string for as long as possible.
}

Вы должны сохранить это значение как DateTime для всех целей, за исключением передачи его пользователю — в этот момент вы вполне можете захотеть использовать его культурные настройки.

В частности, если вы сохраняете значение в базе данных, вы не должны преобразовывать его в текст и включать в оператор SQL — это приведет к проблемам. Вместо этого используйте параметризованный оператор SQL и установите его в качестве значения параметра, все еще как DateTime.

person Jon Skeet    schedule 06.10.2011
comment
DateTime sDate, eDate = new DateTime(); //Чтобы изменить даты для нашего использования. DateTime.TryParseExact(txtFrom.Text, дд/мм/гггг, CultureInfo.InvariantCulture, DateTimeStyles.None, вне sDate); DateTime.TryParseExact(txtFrom.Text, дд/мм/гггг, CultureInfo.InvariantCulture, DateTimeStyles.None, вне eDate); То, что я получаю в edate и sdate, это 01.01.0001 00:00:00, где должно быть 11.03.2011. Я думаю, вы поняли мою точку зрения, вывод неверен, это только моя забота. - person ankur; 06.10.2011
comment
@ankur: вы игнорируете возвращаемое значение TryParseExact, которое почти наверняка ложно. Какое здесь значение txtFrom.Text? Вы говорите, что это только моя забота, но мне кажется, что вы все еще принципиально упускаете из виду тот факт, что DateTime не имеет формата. То, что вы можете увидеть в отладчике, будет форматированным представлением, но это не то же самое, что значение внутри самого DateTime. - person Jon Skeet; 06.10.2011
comment
@ankur: см. обновление к моему ответу вверху — если вы пытаетесь разобрать 02.11.2010, как если бы месяц был указан в формате MM (т.е. ровно две цифры), то это parse действительно не удастся. - person Jon Skeet; 06.10.2011
comment
спасибо за указание, но проблема все еще существует, я объясню, а также вставлю пример кода. то, что я ввел в sDate = 11.03.2011 и в eDate = 25.06.2002, поэтому значения, которые я получил, это eDate = 25.06.2002 (неверно) и sDate = 1/1/0001 (неверно). мой код DateTime.TryParseExact(txtFrom.Text, dd/M/yyyy, CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate); DateTime.TryParseExact(txtTo.Text, дд/м/гггг, CultureInfo.InvariantCulture, DateTimeStyles.None, вне eDate); - person ankur; 06.10.2011
comment
@ankur: Нет, eDate - это DateTime. Это не 25.06.2002, а значение, представляющее 25 июня 2002 года. Не смотрите на представление отладчика всего значения DateTime, чтобы попытаться определить формат строки. Это сбивает вас с толку. Используйте dt.Month и т. д., чтобы определить значение. И 3/11/2011 не соответствует дд/м/гггг, потому что вы указали только одно значение день. Похоже, вам может понадобиться d/M/yyyy, как я упоминал в своем ответе. - person Jon Skeet; 06.10.2011

DateTime не хранит даты в каком-либо определенном формате — он использует внутреннее представление (что именно не должно иметь значения).

После синтаксического анализа строки на DateTime там нет встроенного формата. Существует только формат, когда вы выводите значение. То, что вы видите в отладчике, — это просто преобразование в строку с использованием ваших системных настроек.

Если вы хотите отформатировать DateTime, используйте ToString со строкой формата:

dt.ToString("dd/MM/yyyy");

Обратное также применимо — если вам нужно однозначно проанализировать строку, используйте ParseExact или TryParseExact (оба статических члена DateTime):

DateTime dt;

if(DateTime.TryParseExact(txtDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out td))
{
  // Valid date used in `txtDate.Text`, use dt now.
}

Прочтите о пользовательском и стандартные строки формата даты и времени.

person Oded    schedule 06.10.2011
comment
это снова в строке, так как вы использовали ToString, мне не нужно, чтобы мне нужна была вещь в объекте dattime. можете ли вы предоставить фрагмент кода для того же, выбрав значение из текстового поля, а затем снова изменив его формат на дд/мм/гггг в объекте даты и времени. - person ankur; 06.10.2011
comment
@ankur - DateTime не имеет формата. Вы только форматируете его в строку. - person Oded; 06.10.2011
comment
@Oded: Похоже, более важной частью здесь является анализ, а не форматирование. На моей странице есть текстовое поле, в которое я ввожу дату, и я хочу, чтобы эта дата была в объекте даты и времени. - это задача разбора. - person Jon Skeet; 06.10.2011
comment
Почему бы не использовать CalenderExtender с таким форматом CalenderExtender1.Format = "dd.MM.yyy";? - person Bastardo; 06.10.2011
comment
@ankur - Одед прав - сохраняйте значение внутри DateTime везде, где это возможно (никогда не передавайте его как строку внутри) - это избавит вас от разочарований, связанных с часовыми поясами, форматами и т. д. Вам нужно только беспокоиться о форматировании при показе даты и времени людям - на экранах, в отчетах и ​​т.д. - person StuartLC; 06.10.2011
comment
@Jon - Прочитав ваш ответ, я пересмотрел свой, хотя у ОП есть врожденное непонимание взаимосвязи между DateTime и форматированием. - person Oded; 06.10.2011
comment
@Oded: Согласен, и, надеюсь, мы доберемся до этого ... Я пока оставлю свой аналогичный ответ, так как каждый из нас может редактировать свой независимо, пока один не нажмет OP. - person Jon Skeet; 06.10.2011
comment
@JonSkeet хороший улов .. о разборе. много раз это экономит мое время :) +1 за разбор - person Ravi Gadag; 06.10.2011
comment
@oded то, что я получил после использования вашего кода, не то, что я искал. так вот мой код DateTime sDate, eDate = new DateTime(); //Чтобы изменить даты для нашего использования. DateTime.TryParseExact(txtFrom.Text, дд/мм/гггг, CultureInfo.InvariantCulture, DateTimeStyles.None, вне sDate); DateTime.TryParseExact(txtFrom.Text, дд/мм/гггг, CultureInfo.InvariantCulture, DateTimeStyles.None, вне eDate); Что я получаю в edate и sdate: 01.01.0001 00:00:00, где должно быть 11.03.2011, которое я ввел - person ankur; 06.10.2011
comment
@ankur - Пожалуйста, добавьте подробности, отредактировав вопрос и опубликовав его там. Комментарии — плохое место для примеров кода. - person Oded; 06.10.2011
comment
@ankur - Причина, по которой TryParseExact находится в if, заключается в том, что он возвращает false, если синтаксический анализ не удался, что, похоже, и произошло. Убедитесь, что передаваемая вами строка соответствует используемому вами формату — она должна быть точно такой же. - person Oded; 06.10.2011

Во избежание какой-либо ошибки по месяцам/дням при разборе даты, наверное, лучше использовать DateTime.Parse или DateTime.ParseExact, чем ToDateTime.

Как этой темы и в этой статье указано.

person JMax    schedule 06.10.2011
comment
Проблема, которую пользователь не понимает, заключается в том, что пользователь может ввести любой формат календаря, и только форматы, которые он проверяет, могут быть проанализированы. Отображение DateTime после анализа в определенном формате тривиально. - person Security Hound; 06.10.2011

Попробуйте DateTime.Parse с соответствующим поставщиком формата. В вашем случае должно быть

IFormatProvider culture = new CultureInfo("de-DE", true);
DateTime.Parse(txtDate.Text, culture );
person PVitt    schedule 06.10.2011
comment
Это работает только в том случае, если ввод соответствует предоставленной культуре. Это не удалось бы для любого другого шаблона - person Security Hound; 06.10.2011
comment
Да, это правильно. Поскольку он попросил данный формат, я показал ему пример, как использовать поставщика формата. Как я уже сказал в ответе, он должен использовать соответствующий поставщик формата. Я просто привел пример... - person PVitt; 06.10.2011

Если вы хотите получить к нему доступ в определенном формате, вы должны использовать DateTime.ToString (формат строки).

http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx

person kmkemp    schedule 06.10.2011
comment
Автор хочет принять любой пользовательский ввод и преобразовать предоставленный формат в определенный формат. Для этой цели существуют элементы управления календарем. Текстовое поле вызовет у него только проблемы, существует слишком много возможных форматов для проверки. - person Security Hound; 06.10.2011
comment
Мой ответ связан с тем, как выводить DateTime, а не с тем, как его читать. Его вопрос не просил совета о том, какой элемент управления использовать. Насколько я знаю, он вынужден использовать текстовое поле. - person kmkemp; 06.10.2011