增加处理时间

时间:2012-12-10 10:17:20

标签: c#

我有一段代码可以比较和验证日期。

问题:

此代码在执行期间花费了太多时间。当我评论这段代码时,执行时间会少得多。从这个我可以理解这个代码有一些开销。请提出建议以提高此代码的效率。

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;
    }
}

1 个答案:

答案 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;
        }
    }