Конвертировать дату из формата MM / dd / YYYY в формат dd / MM / YYYY - PullRequest
8 голосов
/ 06 октября 2011

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

Например: дата ввода: 02.11.2010 (дд / мм / гггг) должна быть в том же формате, когда я обращаюсь к нему в объекте даты и времени, но он изменяется на (2/11/2011, т. е. формат MM / дд / гггг) .

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

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

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

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

DateTime sDate, eDate = new DateTime(); 

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

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

То, что я получаю в edate и sdate, это 1/1/0001 12:00:00 AM, где это должно быть 3/11 / 2011.

Ответы [ 5 ]

11 голосов
/ 06 октября 2011

РЕДАКТИРОВАТЬ: Это значение: «02.11.2010» не соответствует формату «дд / мм / гггг».Он соответствует формату "d / M / yyyy" - для "dd / MM / yyyy" это должно быть "11/02/2010".

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


A 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.

11 голосов
/ 06 октября 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.
}

Подробнее о custom и стандарт строки формата даты и времени.

2 голосов
/ 06 октября 2011

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

As эта тема и эта статья указал.

0 голосов
/ 06 октября 2011

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

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

0 голосов
/ 06 октября 2011

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

IFormatProvider culture = new CultureInfo("de-DE", true);
DateTime.Parse(txtDate.Text, culture );
...