C # DateTime.TryParse дата год значение подкачка. 30 февраля 02 - PullRequest
2 голосов
/ 08 сентября 2010

Я столкнулся с проблемой, связанной с датой и временем, моей программе необходимо изменить, является ли введенная пользователем строка даты действительной.

Программа предназначена для обработки диапазонов значений дат от 01.01.2000 ~ 31/12/2020, а формат строки похож на «12 февраля 10».

Проблема, с которой я сталкиваюсьиногда пользователь вводит значение типа «30 февраля 10» (это значение недопустимо), которое проходит проверку формата, но DateTime.TryParse будет интерпретировать эту строку как «10/02/1930 12:00:00 am».

Мое решение этой проблемы состоит в том, чтобы извлекать значение даты, месяца, года из строки отдельно и пытаться воссоздать строку даты.см. следующий код

private static void IsValidDateValue(string userInputValue, CustomValidatorExtended custValidator, string errorMessage, ref bool isValid)
    {
        Regex regexValue = new Regex(SHORT_DATE_VALUE);
        if (regexValue.IsMatch(userInputValue))
        {
            Match match = regexValue.Match(userInputValue);
            int dayValue;
            if (!Int32.TryParse(match.Groups["date"].Value, out dayValue))
            {
                custValidator.ErrorMessage = errorMessage;
                isValid = false;
                return;
            }
            int monthValue;
            if (!Int32.TryParse(ConvertMonthNameToNumber(match.Groups["month"].Value).ToString(), out monthValue))
            {
                custValidator.ErrorMessage = errorMessage;
                isValid = false;
                return;
            }
            //this application is designed to handle only from year 2000 ~ 2020 and user only suppose to enter 2 digits for year 
            int yearValue;
            if (!Int32.TryParse("20" + match.Groups["year"].Value, out yearValue))
            {
                custValidator.ErrorMessage = errorMessage;
                isValid = false;
                return;
            }
            DateTime dtParse;
            if (!DateTime.TryParse(yearValue + "-" + monthValue + "-" + dayValue, out dtParse))
            {
                custValidator.ErrorMessage = errorMessage;
                isValid = false;
                return;
            }
        }
        else
        {
            isValid = true;
            return;
        }
    }

Есть ли более простой способ использования метода по умолчанию .net framework для решения этой проблемы подстановки значений даты-года?

Спасибо и с уважением,

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Это то, что вы хотите:

DateTime parse = DateTime.ParseExact(parseString, "dd MMM yy", CultureInfo.CurrentCulture);

или проверить, будет ли это работать:

DateTime parse;
DateTime.TryParseExact(parseString, "dd MMM yy" CultureInfo.CurrentCulture, out parse);
1 голос
/ 08 сентября 2010
DateTime dt = default(DateTime);
string val = "31 Feb 09";
bool valid = DateTime.TryParseExact(val, "d MMM yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

Устанавливает valid в false и оставляет dt без изменений. Если для val установлено значение "31 Mar 09", для него установлено значение true, а dt содержит 2009-03-31T00: 00: 00 с неопределенным часовым поясом. Используйте различные значения DateTimeStyles для указания локального или UTC, если необходимо.

...