dimayakovlev.ru


Способы создания объекта DateTime в PowerShell

Многие командлеты PowerShell принимают на вход дату, причём дата может быть передана в виде текста или может быть объектом DateTime. Я предпочитаю работать с объектами, поэтому приведу несколько вариантов создания объекта DateTime для использования в скриптах PowerShell.

Для примера рассмотрю запланированное время начала телевизионной трансляции новогоднего поздравления президента РФ с наступающим 2018 годом: 31 декабря 2017 г. 23:55:00.

Использование командлета Get-Date

Передача аргументов выполняется через параметры:

Get-Date -Year 2017 -Month 12 -Day 31 -Hour 23 -Minute 55 -Second 0

Передача аргументов с использованием сплаттинга:

$param = @{'Year' = 2017; 'Month' = 12; 'Day' = 31; 'Hour' = 23; 'Minute' = 55; 'Second' = 0}
Get-Date @param

При использовании этого способа следует иметь в виду, что если какой-то из параметров не задан, для него будет использовано текущее значение времени.

Стандартное создание объекта

В этом случае важно следить за порядком и количеством аргументов, иначе попытка создать объект DateTime завершится ошибкой.

# Вариант 1
New-Object DateTime (2017, 12, 31, 23, 55, 00)

# Вариант 2
[DateTime]::new(2017, 12, 31, 23, 55, 00)

Преобразование типа из String в DateTime

Выполняется очень просто:

[DateTime]'2017.12.31 23:55:00'

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

Например, попытка преобразования строки, на первый взгляд, описывающую корректную дату, '31.12.2017 23:55:00', приведёт к ошибке. В этом случае следует использовать метод DateTime::Parse, который произведёт корректный разбор даты в переданной строке.

[DateTime]::Parse('31.12.2017 23:55:00')

Если метод DateTime::Parse не подходит, потому что строковое представление даты задано в нестандартном виде, следует воспользоваться методом DateTime::ParseExact, позволяющем задать маску, по которой будет производиться разбор даты. Так, чтобы дата из предыдущего примера была успешно преобразована в объект DateTime, можно использовать следующий код:

[DateTime]::ParseExact('31.12.2017 23:55:00', 'dd.MM.yyyy HH:mm:ss', $null)

Теперь создание объектов DateTime для удобной работы с датами в скриптах PowerShell не должно вызывать затруднений.