Проверка строки в определенном формате времени

Я пытаюсь проверить строку (textBox1.Text) в формате времени "чч: мм: сс", для отправки этой строки, как параметр времени, в запросе SQL. Я использую метод TimeSpan.TryParseExact:

        TimeSpan check;
        TimeSpan.TryParseExact(textBox1.Text, "hh:mm:ss", null, out check);
        if(check==null)   MessageBox.Show("incorrect time");
        else... 

Но когда я пишу в текстовое поле 11, к таблице добавляется время 00:00:11 (11 секунд). Я хочу, чтобы было неверное время, правильная строка 00:00:11. Как это сделать правильно?

3 ответа

Решение

Вы должны использовать элементы управления, которые подходят для задачи, которую вы пытаетесь выполнить. Например, в этом случае пользователям может быть проще и последовательнее использовать элемент управления DateTimePicker вместо TextBox.

Установите DateTimePicker Format собственность на Time и ShowUpDown собственность на true, Вы также можете сделать это в коде, как показано ниже.

myTimePicker.Format = DateTimePickerFormat.Time;
myTimePicker.ShowUpDown = true;

Вы также можете использовать свойство CustomFormat для форматирования желаемого времени. Если вы используете CustomFormatвы захотите сделать это:

myTimePicker.Format = DateTimePickerFormat.Custom; //instead of Time as above
myTimePicker.CustomFormat = "hh:mm:ss"; //or whichever format you want

Вы должны изменить свой код, чтобы использовать результат TryParseExact, который имеет логическое значение true, если преобразование прошло успешно. Также обратите внимание, что есть стандартная строка формата для часов / минут / секунд

TimeSpan check;
if(TimeSpan.TryParseExact("09:00:01", "g", CultureInfo.CurrentCulture, out check))
    MessageBox.Show("Correct");
else
    MessageBox.Show("Incorrect");

РЕДАКТИРОВАТЬ
Если вы посмотрите на ваш комментарий ниже, то, вероятно, вам нужна специальная строка формата timepan

TimeSpan check;
if(TimeSpan.TryParseExact("09:00:01", @"hh\:mm\:ss", CultureInfo.CurrentCulture, out check))
    MessageBox.Show("Correct");
else
    MessageBox.Show("Incorrect");

Вы можете сделать это используя регулярные выражения:

using System.Text.RegularExpressions;
namespace Stackru
{
    class Demo
    {
        /* ... */
        readonly Regex timeFormat = new Regex(@"^(?:(?:[0-1][0-9])|2[0-3]):[0-5][0-9]:[0-5][0-9]$", RegexOptions.Compiled);
        public bool IsTimeFormatValid(string time)
        {
            return timeFormat.IsMatch(time);
        }
        /* ... */
    }
}

Пример Regex: http://regex101.com/r/qR3qV6/1

NB: Timespan.TryParse стремится преобразовать строку в промежуток времени. TryParseExact делает то же самое; только он позволяет вам указать культуру / ожидаемый формат (он плохо назван, поскольку не заставляет формат точно соответствовать указанному вами).

Эти методы хотят конвертировать, если это возможно; поэтому они довольно щедры в том, что они примут. Они не предназначены для проверки формата; только сделать лучшую попытку преобразования данных на основе заданного формата. В этом случае, учитывая строку, в которой отсутствует информация, они предполагают, что часы и минуты не указаны, что означает, что они имеют значение 0, поэтому они обрабатывают ваши данные как секунды.

Использование регулярных выражений позволяет избежать этой проблемы - он говорит, что вы хотите проверить формат, а не просто посмотреть, сможет ли система угадать, что означают данные в этом формате.

Другие вопросы по тегам