Ответ 1
Используйте DateTime.ParseExact
.
this.Text="22/11/2009";
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Я пытаюсь преобразовать значение строки в формате date в формат даты dd/MM/yyyy
.
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
В чем проблема?
Он имеет второе переопределение, которое запрашивает IFormatProvider
. Что это? Нужно ли мне это передавать? Если да, как использовать его для этого случая?
Изменить
В чем разница между Parse
и ParseExact
?
Изменить 2
Оба ответа Slaks и Sam работают для меня, в настоящее время пользователь вводит ввод, но я уверен, что они действительны с помощью maskTextbox.
Какой ответ лучше рассматривать во всех аспектах, таких как тип saftey, производительность или что-то, что вам нравится
Используйте DateTime.ParseExact
.
this.Text="22/11/2009";
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Вам нужно вызвать ParseExact
, который анализирует дату, которая точно соответствует предоставленному вами формату.
Например:
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Параметр IFormatProvider
указывает культуру, используемую для анализа даты.
Если ваша строка не принадлежит пользователю, вы должны передать CultureInfo.InvariantCulture
.
Если строка поступает от пользователя, вы должны передать CultureInfo.CurrentCulture
, который будет использовать параметры, указанные пользователем в региональных параметрах на панели управления.
Анализ строкового представления DateTime является сложной задачей, потому что разные культуры имеют разные форматы дат..Net знает эти форматы даты и извлекает их из вашей текущей культуры (System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat
), когда вы вызываете DateTime.Parse(this.Text)
;
Например, строка "22/11/2009" не соответствует ShortDatePattern для США (en-US) но он подходит для Франции (fr-FR).
Теперь вы можете вызвать DateTime.ParseExact
и передать строку точного формата, которую вы ожидаете, или передать соответствующую культуру в DateTime.Parse
для анализа даты.
Например, это правильно проверит вашу дату:
DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );
Конечно, вы не должны просто произвольно выбирать Францию, а что-то подходящее для ваших нужд.
Что вам нужно выяснить, для чего установлен System.Threading.Thread.CurrentThread.CurrentCulture
, и если/почему он отличается от ожидаемого.
Хотя приведенные выше решения эффективны, вы также можете изменить файл webconfig следующим образом:
<configuration>
<system.web>
<globalization culture="en-GB"/>
</system.web>
</configuration>
Ссылка: Формат даты и времени на локальном компьютере по сравнению с производственной машиной
Вам может потребоваться указать культуру для указанного формата даты, например:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
Подробнее см. здесь:
На основе эта ссылка, следующий подход работал у меня:
// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017"
var formatInfo = new DateTimeFormatInfo()
{
ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
используйте это для преобразования строки в datetime:
Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}
Проведя много времени, я решил проблему
string strDate = PreocessDate(data);
string[] dateString = strDate.Split('/');
DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
Как и кто-то выше, вы можете отправить его как строковый параметр, но он должен иметь такой формат: "20130121", и вы можете преобразовать его в этот формат, взяв его непосредственно из элемента управления. Поэтому вы получите его, например, из текстового поля, например:
date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"
чтобы преобразовать его в: '20130121', который вы используете:
date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);
чтобы SQL мог преобразовать его и поместить в вашу базу данных.
Вы также можете использовать
this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
Convert.ToInt32(this.Text.Substring(2,2)), // Month
Convert.ToInt32(this.Text.Substring(0,2)));// Day
Работала для меня ниже кода:
DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));
Пространство имен
using System.Globalization;
Простой способ без внешних ссылок:
public string FormatDate(string date, string format)
{
try {
return DateTime.Parse(date).ToString(format);
}
catch (FormatException)
{
return string.Empty;
}
}
Это также может быть проблемой, если ваша строка 15.06.2009. DateTime Parse ожидает, что это будет 15.06.2009.
Итак, сначала разделить его по косой
var dateParts = "6/15/2019"
var month = dateParts[0].PadLeft(2, '0');
var day = dateParts[1].PadLeft(2, '0');
var year = dateParts[2]
var properFormat = month + "/" +day +"/" + year;
Теперь вы можете использовать DateTime.Parse(ProperFormat, "MM/dd/yyyy"). Это очень странно, но это единственное, что работает для меня.
Изменить вручную:
string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);
От 22.11.2015 он будет конвертирован в 22/11/2015