C#DateTime.TryParse日期年份值交换。 02年2月30日

时间:2010-09-08 00:13:27

标签: datetime swap

我遇到了与日期相关的问题,我的程序需要改变用户输入的日期字符串是否有效。

该程序旨在处理日期值范围从01/01/2000~31 / 12/2020,字符串格式类似于“2月12日”。

我面临的问题是,有时用户输入的值如“30 Feb 10”(此值无效),它会通过格式检查但DateTime.TryParse会将此字符串插入“10/02/1930 12:00:上午12点”。

我对此问题的解决方案是从字符串中单独提取日期,月份,年份值并尝试重新构建日期字符串。请参阅以下代码。

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框架默认方法来解决此日期年度值交换问题?

谢谢&的问候,

2 个答案:

答案 0 :(得分:2)

这就是你想要的:

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

或检查它是否有效:

DateTime parse;
DateTime.TryParseExact(parseString, "dd MMM yy" CultureInfo.CurrentCulture, out parse);

答案 1 :(得分:1)

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。