Получить дату - Как получить и использовать даты в PowerShell
С помощью Get-Date мы можем получить текущую дату и время, которые часто используются в скриптах PowerShell для отметки времени вывода или в сочетании с журналированием. Но кроме отметки времени, мы также можем использовать даты для сравнения или вычисления возраста файлов, или в фильтрах для выбора только определенного диапазона из набора результатов.
Работа с датами в целом также всегда немного сложна. Как вы сравниваете даты или вычисляете дни между двумя датами? И как вы получаете дату, которая была x дней назад?
В этой статье мы рассмотрим, как получить даты с помощью командлета Get-Date в PowerShell, различные варианты форматирования, вычисления с датами и их сравнение.
PowerShell Получить-Дату
Команда Get-Date в PowerShell по умолчанию возвращает текущую дату и время с вашего компьютера. Без каких-либо параметров она просто выведет дату и время в длинном формате:
Get-Date
Result
dinsdag 6 december 2022 15:51:54То, что большинство не знают, это то, что командлет Get-Date на самом деле возвращает больше, чем только текущая дата и время в длинном формате. Если сохранить результат в переменной или выбрать все свойства объекта, вы увидите, что он также возвращает, например, день года:
Get-Date | Select *
Это означает, что если вам нужен только текущий день недели, вы можете просто сделать это:
Get-Date | Select DayOfWeek
Result
DayOfWeek
---------
Tuesday
Or to get only the value
Get-Date | Select -ExpandProperty DayOfWeek
Result
TuesdayЕсли вы хотите вернуть только текущую дату или текущее время, то мы можем использовать параметр DisplayHint. Это определяет, какой элемент будет отображен:
Get-Date -DisplayHint date
Result
dinsdag 6 december 2022
Or time
Get-Date -DisplayHint time
15:51:54Мы также можем получить информацию о дате из дат в будущем или прошлом. С параметрами -day, -month, -year мы можем задать объект данных, который хотим создать. Например, если вы хотите узнать, на какой день приходится 6 декабря 2023 года, мы изменяем дату:
Get-Date -year 2023
Result (woensdag = wednesday 😉 )
woensdag 6 december 2023 16:11:58Как видите, я указал только год. Поэтому для остальных значений используется текущая дата. Но вы также можете указать полную дату:
Get-Date -day 1 -month 07 -year 2023 | select *Форматировать даты
Чтобы отформатировать даты в PowerShell, мы можем использовать Get-Date с помощью либо формата .Net, либо спецификатора UFormat. Спецификатор формата .Net использует более известные буквы для указания формата, в то время как UFormat использует % за которым следует буква. В обоих случаях результатом является объект строки, а не объект даты. Таким образом, вы получаете только дату, отформатированную по запросу.
Давайте начнем с формата .Net, который установлен для форматирования даты в PowerShell. Для форматирования даты мы можем использовать, например, следующие спецификаторы:
| Спецификатор | Описание |
|---|---|
| 2 символа Дня месяца |
| 2 цифры месяца |
| 2 цифры года |
| Полное название дня |
| Полное название месяца |
| 4 цифры года |
Вы можете найти полный список спецификаторов здесь в документации.
Чтобы отформатировать дату, мы можем указать параметр -Format, за которым следует строка с форматом даты, который мы хотим. Например:
Get-Date -Format "dd-MM-yyyy"
06-12-2022UFormat использует тот же принцип, только другой спецификатор, конечно.
Заметка
Хотя нужно знать, что спецификаторы UFormat изменились с PowerShell 6.2. Так что имейте это в виду, когда будете запускать свой скрипт на разных версиях PowerShell.
| Спецификатор | Описание |
|---|---|
| 2 символа Дня месяца |
| 2 цифры месяца |
| 2 цифры года |
| Полное название дня |
| Полное название месяца |
| 4 цифры года |
Вы можете найти полный список спецификаторов UFormat здесь в документации.
Get-Date -UFormat "%A %d %b %Y"
Result
dinsdag 06 dec 2022Формат даты и времени
Так же, как и с форматом даты, мы можем выбирать между спецификаторами формата .Net и UFormat для форматирования результата DateTime команды Get-Date в PowerShell. Оба возвращают форматированную строку, а не объект даты.
Чтобы отформатировать часть времени даты с использованием общепринятого спецификатора формата .Net, вам нужно использовать параметр -format, за которым следует строка с форматом времени или DateTime, который вы хотите получить.
| Спецификатор | Описание |
|---|---|
| Время в 24-часовом формате |
| Время в формате 24 часа с секундами |
| Смещение по временной зоне относительно UTC |
| Время в 12-часовом формате |
| Время в 12-часовом формате с AM/PM |
Get-Date -Format "HH:mm K"
Result
16:09 +01:00Чтобы отформатировать DateTime в PowerShell с использованием спецификатора UFormat, вам нужно использовать параметр -Uformat, за которым следует строка с форматом. Все варианты для UFormat можно найти здесь в документации.
Например, чтобы отформатировать DateTime в PowerShell, мы можем сделать следующее:
Get-Date -UFormat "%A %d %B %Y %R %Z"
Result
dinsdag 06 december 2022 16:14 +01Получить дату минус 1 день
Добавление или вычитание дней из дат в PowerShell можно сделать, используя метод AddDays. Мы можем использовать положительное число для добавления дней и отрицательное число для вычитания дней. Таким образом, если мы хотим получить дату вчерашнего дня, мы сначала получим текущую дату с помощью Get-Date, вычитая 1 день:
(Get-Date).AddDays(-1)
Result
maandag 5 december 2022 16:24:48Как вы можете видеть, нам нужно обернуть командлет Get-Date в круглые скобки. Таким образом, командлет Get-Date выполняется первым, а затем выполняются другие команды или методы.
Когда вам нужно рассчитать несколько дат, например, когда нам нужно восстановить файлы между двумя датами в SharePoint, вы также можете сохранить текущую дату в переменной. А затем использовать метод AddDays, чтобы добавить или вычесть дни из нее:
$today = Get-Date # dinsdag 6 december 2022 16:28:51
$tomorrow = $today.AddDays(1) # woensdag 7 december 2022 16:28:51
$yesterday = $today.AddDays(-1) # maandag 5 december 2022 16:28:51 AddDays — это не единственный метод, который мы можем использовать для вычисления дат. Мы также можем добавлять или вычитать месяцы, годы или часы, например. Все это делается по тому же принципу, что и метод AddDays:
- AddTicks
- AddMiliseconds
- AddSeconds
- AddMinutes
- AddHours
- AddDays
- AddMonths
- AddYears
И забавное в том, что мы можем объединить их всех, если захотим:
$today = Get-Date # dinsdag 6 december 2022 16:28:51
$today.AddYears(2).AddMonths(3).AddDays(1).AddHours(2).AddMinutes(10)
Result:
vrijdag 7 maart 2025 18:38:51Сравнить даты в PowerShell
Сравнение дат в PowerShell на самом деле проще, чем вы могли подумать. Объекты DateTime можно сравнивать напрямую друг с другом, используя обычные операторы сравнения PowerShell, такие как -gt и -lt, например.
Итак, чтобы сравнить две даты в PowerShell, мы можем сделать следующее:
$today = Get-Date # dinsdag 6 december 2022 16:44:51
$secondDate = Get-Date -Date "20-10-2022" # donderdag 20 oktober 2022
Check if secondDate is before or after Today
$today -gt $secondDate # True
$today -lt $secondDate # FalseМы также можем использовать этот метод, чтобы проверить, создан ли файл до или после даты, используя командлет Get-ChildItem:
$secondDate = Get-Date -Date "20-10-2022" # donderdag 20 oktober 2022
$fileDate = get-childitem updates.txt | Select -ExpandProperty CreationTime
FileDate is donderdag 24 februari 2022 13:11:41
if ($secondDate -gt $fileDate) {
Write-Host "File is older then $secondDate"
}Преобразовать строку в дату с помощью PowerShell
Прежде чем вы сможете работать с датами в PowerShell, вам нужно убедиться, что даты являются объектами DateTime. Например, если у вас есть CSV-файл с датами, которые вы хотите использовать, вам сначала нужно будет преобразовать строку в дату.
Для этого мы просто можем привести строку к объекту DateTime:
[DateTime] "2022-11-24"
Result
maandag 24 november 2022 00:00:00Мы также можем немедленно отформатировать результаты, если это необходимо, поместив преобразование dateTime в скобки, а затем преобразовав его в отформатированную строку:
([DateTime] "2022-11-24").ToString('yyyy-MM-dd')Если строка, которую вы хотите преобразовать в дату, имеет Divergent формат, вам может потребоваться указать формат строки даты, используя ParseExact. Важно отметить, что вы указываете формат ввода, а не вывода!
$dateString = '14-nov-22'
$date = [datetime]::ParseExact($dateString, "dd-MMM-yy", $null)Получить дни между датами
Мы можем сравнивать даты, добавлять или вычитать дни из дат, но вы знали, что мы также можем вычислить количество дней (или времени) между датами в PowerShell? Для этого мы собираемся использовать командлет New-TimeSpan с двумя объектами даты.
Допустим, мы хотим узнать, сколько дней осталось до Рождества. Для этого мы берем текущую дату (начальная дата) с помощью Get-Date и создаем новый объект даты для 25 декабря (конечная дата):
$today = Get-Date
$Christmas = Get-Date -day 25 -month 12
New-TimeSpan -Start $today -End $christmas
Result
Days : 18
Hours : 0
Minutes : 5
Seconds : 22
Milliseconds : 241
Ticks : 15555222411487
TotalDays : 18,0037296429248
TotalHours : 432,089511430194
TotalMinutes : 25925,3706858117
TotalSeconds : 1555522,2411487
TotalMilliseconds : 1555522241,1487Заключение
Работа с датами может показаться сложной в начале, но я должен сказать, что PowerShell делает это довольно просто. Как вы видели, мы можем легко сравнивать даты, добавлять или вычитать время из дат и рассчитывать разницу между двумя датами.
Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.


