Поиск по сайту:

Получить дату - Как получить и использовать даты в 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. Для форматирования даты мы можем использовать, например, следующие спецификаторы:

СпецификаторОписание
dd
2 символа Дня месяца
MM
2 цифры месяца
yy
2 цифры года
dddd
Полное название дня
MMMM
Полное название месяца
yyyy
4 цифры года
Форматы даты PowerShell

Вы можете найти полный список спецификаторов здесь в документации.
Чтобы отформатировать дату, мы можем указать параметр -Format, за которым следует строка с форматом даты, который мы хотим. Например:

Get-Date -Format "dd-MM-yyyy"
06-12-2022

UFormat использует тот же принцип, только другой спецификатор, конечно.

Заметка

Хотя нужно знать, что спецификаторы UFormat изменились с PowerShell 6.2. Так что имейте это в виду, когда будете запускать свой скрипт на разных версиях PowerShell.
СпецификаторОписание
%d
2 символа Дня месяца
%m
2 цифры месяца
%y
2 цифры года
%A
Полное название дня
%B
Полное название месяца
%Y
4 цифры года
Форматы даты PowerShell

Вы можете найти полный список спецификаторов UFormat здесь в документации.

Get-Date -UFormat "%A %d %b %Y"

Result
dinsdag 06 dec 2022

Формат даты и времени

Так же, как и с форматом даты, мы можем выбирать между спецификаторами формата .Net и UFormat для форматирования результата DateTime команды Get-Date в PowerShell. Оба возвращают форматированную строку, а не объект даты.

Чтобы отформатировать часть времени даты с использованием общепринятого спецификатора формата .Net, вам нужно использовать параметр -format, за которым следует строка с форматом времени или DateTime, который вы хотите получить.

СпецификаторОписание
HH:mm
Время в 24-часовом формате
HH:mm:ss
Время в формате 24 часа с секундами
K
Смещение по временной зоне относительно UTC
hh:mm
Время в 12-часовом формате
hh:mm – tt
Время в 12-часовом формате с AM/PM
Формат времени PowerShell
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 делает это довольно просто. Как вы видели, мы можем легко сравнивать даты, добавлять или вычитать время из дат и рассчитывать разницу между двумя датами.

Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.