DateTime.TryParseExact() отклоняет допустимые форматы

Я анализирую значение DateTime на странице ASP.NET WebForms, и строка даты продолжает отклоняться методом DateTime.TryParseExact(), хотя она явно соответствует одной из предоставленных строк формата.

Кажется, это не работает на моей машине разработки дома, но работает на рабочем сервере, поэтому я думаю о задействованных локальных настройках даты, но эта ошибка возникает, даже когда я указываю объект IFormatProvider (CultureInfo) в качестве параметра

Вот код:

DateTime startDate;
string[] formats = { "dd/MM/yyyy", "dd/M/yyyy", "d/M/yyyy", "d/MM/yyyy",
                    "dd/MM/yy", "dd/M/yy", "d/M/yy", "d/MM/yy"};

var errStart = row.FindControl("errStartDate"); //my date format error message
if (!DateTime.TryParseExact(txtStartDate.Text, formats, null, DateTimeStyles.None, out startDate))
{
    errStart.Visible = true; //we get here even with a string like "20/08/2012"
    return false;
}
else
{
    errStart.Visible = false;
}

Обратите внимание, что выше я указываю null FormatProvider, но та же проблема возникает, когда я указываю объект CultureInfo как (CultureInfo provider = new CultureInfo("en-US")) для этого параметра.

Что мне не хватает?


person see sharper    schedule 17.08.2012    source источник
comment
В культуре США формат даты — м/д/г, а не д/м/г.   -  person StuartLC    schedule 17.08.2012
comment
Даже без упоминания FormatProvider этот код у меня работает нормально. Попробуйте указать InvariantCulture.   -  person danish    schedule 17.08.2012


Ответы (5)


Пытаться:

 DateTime.TryParseExact(txtStartDate.Text, formats, 
        System.Globalization.CultureInfo.InvariantCulture,
        System.Globalization.DateTimeStyles.None, out startDate)
person Adil Mammadov    schedule 17.08.2012

Здесь вы можете проверить пару вещей.

  1. Форматы даты вы используете правильно. Вы можете указать более одного формата для DateTime.TryParseExact. Полный список форматов доступен здесь.
  2. CultureInfo.InvariantCulture что, скорее всего, добавит проблем. Таким образом, вместо того, чтобы передавать значение NULL или устанавливать для него значение CultureInfo provider = new CultureInfo("en-US"), вы можете написать его так. .

    if (!DateTime.TryParseExact(txtStartDate.Text, formats, 
                    System.Globalization.CultureInfo.InvariantCulture,
                    System.Globalization.DateTimeStyles.None, out startDate))
    {
        //your condition fail code goes here
        return false;
    }
    else
    {
        //success code
    }
    
person Amnesh Goel    schedule 19.09.2015

Это простой метод, используйте ParseExact

CultureInfo provider = CultureInfo.InvariantCulture;
DateTime result;
String dateString = "Sun 08 Jun 2013 8:30 AM -06:00";
String format = "ddd dd MMM yyyy h:mm tt zzz";
result = DateTime.ParseExact(dateString, format, provider);

Это должно сработать для вас.

person Jidheesh Rajan    schedule 08.10.2013

Попробуйте С# 7.0

var Dob= DateTime.TryParseExact(s: YourDateString,format: "yyyyMMdd",provider: null,style: 0,out var dt)
 ? dt : DateTime.Parse("1800-01-01");
person Waleed A.K.    schedule 20.04.2018

string DemoLimit = "02/28/2018";
 string pattern = "MM/dd/yyyy";
 CultureInfo enUS = new CultureInfo("en-US"); 
 DateTime.TryParseExact(DemoLimit, pattern, enUS, 
                     DateTimeStyles.AdjustToUniversal, out datelimit);

Подробнее https://msdn.microsoft.com/en-us/library/ms131044(v=vs.110).aspx

person islam elgaidi    schedule 05.02.2018