我遇到了与日期相关的问题,我的程序需要改变用户输入的日期字符串是否有效。
该程序旨在处理日期值范围从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框架默认方法来解决此日期年度值交换问题?
谢谢&的问候,
答案 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。