Окружение свободного текстового поля даты, для использования 'Дата К' полю критериев

Я нашел что Дата. TryParse довольно снисходителен на входе - настолько отскакивающий день, или месяц все еще возвратит значение, хотя всегда округленный пол. Например:

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

или

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

Я хотел бы позволить пользователю вводить дату, которая будет использоваться в качестве верхнего предела даты для поиска - там простой способ заставить это окружать - например: возвратите 31.12.2010, когда всего '2010' будет вводиться...

Заранее спасибо.

1
задан Overflew 27 July 2010 в 09:31
поделиться

2 ответа

У вас может быть что-то вроде этого:

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
ответ дан 2 September 2019 в 22:42
поделиться

Предполагая, что вы хотите иметь возможность разбирать все форматы, которые может 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;
    }

Это установит максимальное значение только для тех частей, которые пользователь не указал.

1
ответ дан 2 September 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: