#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??