PowerShell — преобразование строки в дату
Зачем преобразовывать строку в дату
Строковые представления дат удобны для хранения и отображения, но мешают вычислениям. Преобразование в объект System.DateTime позволяет выполнять сравнения, арифметику (сложение/вычитание интервалов), фильтрацию по диапазонам и форматирование для вывода или логики.
Краткое определение: DateTime — встроенный тип .NET для представления момента во времени с точностью до 100 наносекунд и возможностью работы с часовыми поясами через DateTimeOffset.
Основные методы преобразования строки в дату
Ниже приведены пять стандартных приёмов с примерами и пояснениями. Во всех примерах замените “02/03/2023” на вашу входную строку.
1. [DateTime]::Parse
- Откройте PowerShell от администратора.
- Выполните:
$dateString = "02/03/2023"
$parsedDate = [DateTime]::Parse($dateString)
Write-Output $parsedDateВажно: Parse учитывает текущую культуру (CultureInfo) с форматами дат по умолчанию. В английской (США) культуре строка “02/03/2023” интерпретируется как MM/dd/yyyy (3 февраля 2023). В русской — как dd.MM.yyyy. Если формат входа однозначен для вашей локали, Parse удобен, но он бросит исключение при неверном формате.

2. [DateTime]::ParseExact
Когда формат строгий и известен, используйте ParseExact.
$dateString = "02/03/2023"
$format = "MM/dd/yyyy"
$parsedDate = [DateTime]::ParseExact($dateString, $format, $null)
Write-Output $parsedDateParseExact ожидает точное совпадение формата. Это снижает риск неоднозначного разбора. При несоответствии будет выброшено исключение.

3. Get-Date
Get-Date умеет парсить многие строковые представления дат и возвращает объект DateTime.
$dateString = "02/03/2023"
$parsedDate = Get-Date $dateString
Write-Output $parsedDateGet-Date полезен для быстрой конверсии и имеет дополнительные параметры для вывода и форматирования. Однако поведение зависит от реализации парсинга и культуры.

4. Явное приведение ([DateTime]$string) — ускоритель
Приведение через тип часто работает как краткий синтаксис для Parse:
$dateString = "02/03/2023"
$parsedDate = [DateTime]$dateString
Write-Output $parsedDateЭто удобно в однословных выражениях, но имеет те же ограничения, что и Parse — зависит от культуры и бросает исключение при несоответствии.

5. TryParse и TryParseExact — безопасный вариант
Для обработки непредсказуемых входных данных используйте TryParse/TryParseExact. Они возвращают булево значение и не бросают исключение.
$dateString = "02/03/2023"
[DateTime] $out = $null
if ([DateTime]::TryParseExact($dateString, "MM/dd/yyyy", $null, [System.Globalization.DateTimeStyles]::None, [ref]$out)) {
Write-Output "Успех: $out"
} else {
Write-Output "Не удалось распарсить"
}TryParse полезен в скриптах, где вход может быть произвольным (лог-файлы, пользовательский ввод, CSV).

Примеры форматов и локали
- Формат ISO (рекомендуемый для обмена): “yyyy-MM-dd” — однозначен и не зависит от культуры.
- Русский формат часто выглядит как “dd.MM.yyyy”.
- При обработке логов из разных систем отдавайте предпочтение ParseExact с явным форматом или преобразуйте вход к ISO перед парсингом.
Совет: записывайте даты в базе/файлах в ISO-формате (yyyy-MM-ddTHH:mm:ssZ) — это упрощает портирование и сравнения.
Ошибки и когда методы не работают
Important: Parse и приведение бросают исключение на неверный формат. ParseExact и TryParseExact требуют точного формата. Get-Date может вести себя непредсказуемо для редких форматов. Всегда валидируйте вход.
Типичные причины ошибок:
- Неверный разделитель (“/“ vs “.”).
- Неполная дата (только год и месяц без дня).
- Многоязычные названия месяцев (“Mar” vs “март”).
Альтернативные подходы
- Предобработка: заменить разделители или привести слова месяцев к английским/локальной форме перед парсингом.
- Использовать DateTimeOffset, если важен часовой пояс.
- Для больших объёмов данных — парсить в параллели (ForEach-Object -Parallel в PowerShell 7) с TryParse.
Чек-лист для разработчика и администратора
- Разработчик: используйте ParseExact/TryParseExact для предсказуемости.
- Оператор/администратор: логируйте исходную строку при ошибке парсинга.
- Аналитик: храните даты в ISO и конвертируйте при экспорте.
Критерии приёмки
- Скрипт успешно конвертирует все допустимые входы в тестовом наборе.
- Неверные строки не приводят к падению скрипта (используется TryParse/TryParseExact или обработка исключений).
- Вывод — объект DateTime или DateTimeOffset в зависимости от требований.
Небольшой набор тестов приёмки
- Вход “2023-02-03” с форматом yyyy-MM-dd — ожидаемый успешный парсинг.
- Вход “03.02.2023” с ParseExact(“dd.MM.yyyy”) — успешный.
- Вход “32/01/2023” — ожидаемый неуспех, проверка логирования.
Краткий глоссарий
- DateTime: объект .NET для даты и времени.
- Parse: метод, который пытается разобрать строку по текущей культуре.
- ParseExact: метод, требующий точного формата.
- TryParse: безопасный метод, не выбрасывающий исключений.
Резюме
Преобразование строк в DateTime в PowerShell — базовая и часто необходимая операция. Для строгих форматов используйте ParseExact или TryParseExact. Для пользовательских входов применяйте TryParse, чтобы избежать аварийных завершений. Рекомендуется хранить даты в ISO-формате и логировать неудачные парсинги.
Примечание: если появились вопросы или примеры входных строк, добавьте их в комментарии — помогу подобрать оптимальный подход.
Похожие материалы
Отключение BitLocker в Windows 10 — полное руководство
Как защитить Windows от программ‑вымогателей
Как начать отладку ядра Windows
Новая строка поиска Outlook — руководство
Управление Android с ПК через AirDroid