История вопроса:
Работа с датами и временем всегда была отдельным аспектом программирования в Visual Basic — от старых типов Variant/Date в VB6 до структур Date/DateTime в VB.NET. Появление класса DateTime позволило более гибко оперировать датами, получать системные значения, вычислять интервалы и корректно форматировать даты.
Проблема:
Часто возникают ошибки преобразования строк в DateTime (особенно при разных локалях), неверной работы с часовыми поясами, неправильного форматирования для отображения пользователю или отправки на сервер.
Решение:
DateTime — это структура, позволяющая хранить дату и время, выполнять арифметические операции, сравнения, а также преобразование в нужный формат. Для парсинга строковых дат используют Parse, TryParse, а для форматирования — метод ToString с форматной строкой и (по желанию) CultureInfo.
Пример кода:
Dim today As DateTime = DateTime.Now Dim birth As DateTime = New DateTime(1990, 1, 1) Dim formatted As String = today.ToString("yyyy-MM-dd HH:mm") Dim parsed As DateTime If DateTime.TryParse("15/06/2024", parsed) Then Console.WriteLine(parsed.ToString()) End If
Ключевые особенности:
1. Чему равен DateTime.MinValue?
DateTime.MinValue — дата 01.01.0001 00:00:00 (а не, например, 01.01.1970 как в UNIX). Используйте с осторожностью при проверке "установлено ли значение".
2. Можно ли хранить "сутки без времени" в DateTime?
Нет, тип DateTime всегда включает значения времени. При необходимости хранить только дату, присвойте время "00:00:00" и используйте только формат даты при выводе.
3. Как корректно сравнивать даты, игнорируя время?
Для сравнения только части даты избавляйтесь от времени:
Dim aDate As DateTime = DateTime.Now.Date Dim bDate As DateTime = someOtherDate.Date If aDate = bDate Then ...
Клиентское приложение принимает дату рождения пользователя через TextBox и напрямую парсит её через DateTime.Parse(textBox.Text). Европейский и американский пользователи вводят даты в разных форматах. В результате — неверные даты рождения или исключения.
Плюсы:
Минусы:
Ввод даты производится через DateTimePicker или с помощью TryParseExact(textBox.Text, "dd.MM.yyyy", CultureInfo.InvariantCulture, ...). В коде предусмотрены fallback-механизмы и точная валидация.
Плюсы:
Минусы: