Как проверить, соответствует ли введенная дата правильному формату?

#vb.net #winforms

#vb.net #winforms

Вопрос:

У меня есть текстовое поле, в котором пользователь должен ввести дату. Как я могу проверить, соответствует ли введенная дата правильному формату даты?

Вот так: 02/02/2008

  • не так 022/22/-1
  • не так 2009/02/02
  • не так 02/Jun/2015
  • не так 02/abc/2010

(Я не хочу использовать DateTimePicker или MonthCalender).

РЕДАКТИРОВАТЬ 1

Я попробовал это так

 Private Sub txtHireDate_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtHireDate.Validated
    Dim dateString As String = txtHireDate.Text
    Dim formats As String = "MM/dd/yyyy"
    Dim dateValue As DateTime

    If DateTime.TryParseExact(dateString, formats, New CultureInfo("en-US"), DateTimeStyles.None, dateValue) Then

    End If
  

Но он показывает некоторые ошибки

введите описание изображения здесь

Комментарии:

1. Обратите внимание, что даже если вы используете элемент управления для заполнения текстового поля, все равно рекомендуется его проверить.

Ответ №1:

Используйте DateTime.Функция TryParseExact:

 String dateString = dateTextBox.Text;
String formats = "MM/dd/yyyy";
DateTime dateValue;

if (DateTime.TryParseExact(dateString, formats, 
                              new CultureInfo("en-US"), 
                              DateTimeStyles.None, 
                              out dateValue))
{
    // That means the value of the date is in the specified format..
}
  

Не забудьте использовать Globalization namespace :

 using System.Globalization;
  

Комментарии:

1. Для чего это new CultureInfo("en-US")

2. Используйте это, если вы хотите указать культуру для datetime значения.. Вы можете проигнорировать это и использовать NULL вместо этого.

3. Вам нужно использовать en-CA, а не en-US.

Ответ №2:

Я использую следующее регулярное выражение в FormatValidator элементе управления под текстовым полем:

 ^(19|20)dd[- /.]?(0[1-9]|1[012])[- /.]?(0[1-9]|[12][0-9]|3[01])$
  

Это в формате год-месяц-день, и допускает следующие форматы:

  • гггг-ММ-дд
  • ггггММдд
  • гггг / ММ / дд
  • гггг.ММ.дд

Обратите внимание, что формат год месяц день нельзя перепутать при работе со стандартными датами Северной Америки. Американский формат (ММ / дд / гггг) будет обрабатываться иначе, чем канадский формат (дд / ММ / гггг), но вы не узнаете, что это неправильно, пока не наберете количество дней больше 12…

Пример добавления средства проверки на страницу:

 <asp:RegularExpressionValidator ID="txtTreatmentDate_FormatValidator" runat="server" 
    Display="Dynamic" ValidationGroup="LogSave"
    ControlToValidate="txtTreatmentDate" ValidationExpression="ThisIsIgnored"
    ErrorMessage="*Invalid Date" />
  

Затем в вашем коде за (C #)

 protected void Page_Load(object sender, EventArgs e)
{
    txtTreatmentDate_FormatValidator.ValidationExpression = DateHandler.DateFormatStandardRegex;
}
  

В DateHandler (также с форматом времени, если вам это нужно):

 public static readonly String DateFormatStandardRegex = "^(19|20)\d\d[- /.]?(0[1-9]|1[012])[- /.]?(0[1-9]|[12][0-9]|3[01])$";
public static readonly String TimeFormat24HourRegexp = "(20|21|22|23|[01]\d):?([0-5]\d):?([0-5]\d(\.\d*)?)?";
  

Поскольку вы не указали формат, который искали (я предполагаю, что US), я не изменял его, чтобы он работал для вас, но это простой вопрос перемещения блоков и изменения разрешенных разделителей.

Канадский формат:

 "^(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)\d\d$";
  

При разборе даты вам определенно захочется использовать ParseExact с использованием языка EN-CA (я думаю, это сокращенная форма) или указать строку формата, которой вы хотите, чтобы дата соответствовала (например, «дд / ММ / гггг»)

Комментарии:

1. Кроме того, я просто извлек экранирование из своего ответа. Я сохраняю это регулярное выражение в служебном классе, и вместо того, чтобы копировать его в каждый элемент управления проверкой, я добавляю его в средство проверки при загрузке страницы.

2. Что ж, я собираюсь использовать канадский формат. У меня нет опыта работы с регулярным выражением, не могли бы вы рассказать мне, как использовать ваш код?

3. В вашей кнопке, которая отправляет страницу, вам нужно будет добавить ValidationGroup="LogSave" или любую другую группу проверки, которую вы хотите использовать. В данном случае это было для медицинского журнала.

4. Обратите внимание, что вопрос касается Winforms, а не веб-форм. Так что этот ответ здесь не совсем применим. И когда не привязано к FormatValidator , использование DateTime.TryParse(Exact) , безусловно, является лучшим решением, чем самодельное регулярное выражение.

5. @Kendrick: Не работает ли Failed_Noob в приложении на базе Windows??