舍入自由文本日期字段,以使用“日期到”条件字段

时间:2010-07-27 09:31:19

标签: c# datetime criteria

我发现Date.TryParse对输入非常宽松 - 因此跳过日期或月份仍将返回一个值,尽管总是四舍五入。 E.g:

DateTime.TryParse("2010", out testDate)
-> 01 Jan 2010

DateTime.TryParse("may 2010", out testDate)
-> 01 May 2010

我想允许用户输入一个日期作为搜索的上限日期 - 是否有一种简单的方法可以将其舍入 - 例如:返回时的2010年12月31日2010'进入......

提前致谢。

2 个答案:

答案 0 :(得分:1)

你可以这样:

string inputDate = "May 2010";
int year = 0;
DateTime date = new DateTime();

// Try to parse just by year.
// Otherwise parse by the input string.
if (int.TryParse(inputDate, out year))
{
    date = new DateTime(year, 12, 31);
}
else
{
    // Parse the date and set to the last day of the month.
    if (DateTime.TryParse(inputDate, out date))
    {
        date = date.AddMonths(1).AddMilliseconds(-1);
    }
    else
    {
        // Throw exception for invalid date?
    }
}

答案 1 :(得分:1)

假设您希望能够解析DateTime.TryParse可以使用的所有格式,您可以执行以下操作:

    public static bool DateTimeTryParseMax(string dtText, out DateTime testDate)
    {
        testDate = DateTime.MinValue;

        string nFmt = null;
        foreach (string fmt in System.Globalization.DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns().Concat(new string[] {"yyyy", "yy"}))
        {
            if (DateTime.TryParseExact(dtText, fmt, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out testDate))
            {
                nFmt = fmt;
                break;
            }
        }

        if (nFmt == null)
            return false;

        nFmt = nFmt.Replace("dddd", "xxxx"); // Remove Day of the week as not helpful
        if (!nFmt.Contains("M")) testDate = testDate.AddMonths(12).AddMonths(-1);
        if (!nFmt.Contains("d")) testDate = testDate.AddMonths(1).AddDays(-1);
        if (!nFmt.Contains("h") & !nFmt.Contains("H")) testDate = testDate.AddDays(1).AddHours(-1);
        if (!nFmt.Contains("m")) testDate = testDate.AddHours(1).AddMinutes(-1);
        if (!nFmt.Contains("s")) testDate = testDate.AddMinutes(1).AddSeconds(-1);

        return true;
    }

这只会将用户未使用的部分设置为最大值。