我有一段代码可以比较和验证日期。
问题:
此代码在执行期间花费了太多时间。当我评论这段代码时,执行时间会少得多。从这个我可以理解这个代码有一些开销。请提出建议以提高此代码的效率。
DateTime regDate;
DateTime dob;
extractDate(buffer[5], buffer[6], out regDate, out dob);
private void extractDate(string date, string rDate, out DateTime regDate, out DateTime dob)
{
if (date == "") // Date of birth is not given;
{
regDate = getStandardDate(rDate); // MM/DD/YYYY
dob = regDate.AddYears(-18);
}
else
{
dob = getStandardDate(date);
}
if (rDate == "")
{
dob = getStandardDate(date);
regDate = dob.AddYears(18);
}
else
{
regDate = getStandardDate(rDate);
}
}
private DateTime getStandardDate(string date)
{
bool checkDate = isValidDate(date);
if (checkDate)
{
IFormatProvider culture = new System.Globalization.CultureInfo("en-gb", true);
DateTime dt;
if (karachiDateFormat)
{
dt = DateTime.Parse(date);
}
else
{
dt = DateTime.Parse(date, culture);
}
return dt.Date;
}
else
{
return DateTime.Now.Date;
}
}
private bool isValidDate(string date)
{
IFormatProvider culture = new System.Globalization.CultureInfo("en-gb", true);
DateTime Ttime;
if (!karachiDateFormat)
{
Ttime = DateTime.Parse(date, culture);
}
else
{
Ttime = DateTime.Parse(date);
}
date = string.Empty;
date = Ttime.Date.ToShortDateString();
string[] splitDate = date.Split('/');
int day = Int32.Parse(splitDate[1]);
int month, year;
month = Int32.Parse(splitDate[0]);
year = Int32.Parse(splitDate[2]);
DateTime time = DateTime.Now;
if ((day > 0 && day < 32) && (month > 0 && month <= 12) && (year > 1950 && year < time.Year))
{
return true;
}
else
{
return false;
}
}
答案 0 :(得分:0)
我相信您可以通过更改isValidDate方法来加快代码速度。
根据我的理解,如果文本与日期模式匹配,则验证文本。我会尝试完全删除此方法,并用DateTime.Parse
替换getStandardTime中的DateTime.TryParse
。这将同时处理验证和解析。见DateTime.TryParse Method
如果您需要验证日期,请使用DateTime结构进行验证,而不是使用字符串重复表示。
此外,您正在解析两个日期(日期和rDate)。也许使用Parallel.Invoke会有所帮助,但我不确定。
private void extractDate(string date, string rDate, out DateTime regDate, out DateTime dob)
{
Parallel.Invoke(
() =>
{
if (date == "") // Date of birth is not given;
{
regDate = getStandardDate(rDate); // MM/DD/YYYY
dob = regDate.AddYears(-18);
}
else
{
dob = getStandardDate(date);
}
},
() =>
{
if (rDate == "")
{
dob = getStandardDate(date);
regDate = dob.AddYears(18);
}
else
{
regDate = getStandardDate(rDate);
}
});
}
private DateTime getStandardDate(string date)
{
IFormatProvider culture = new System.Globalization.CultureInfo("en-gb", true);
DateTime dt;
if (karachiDateFormat)
{
if (!DateTime.TryParse(date, out dt))
dt = DateTime.Now.Date;
}
else
{
if (!DateTime.TryParse(date, culture, out dt))
dt = DateTime.Now.Date;
}
}