Сравнение даты в Powershell не работает в операторе if - PullRequest
0 голосов
/ 10 октября 2019

У меня есть требование сравнивать даты с помощью командной строки powershell Get-Date. Пример того, как я использую команду Get-Date, выглядит следующим образом.

$Date1 = Get-Date -Format "dd/MM/yyyy HH:mm:ss" -Day 31 -Hour 07 -Minute 30 -Month 12 -Second 00 -Year 2021

Если $Date1 выше сравнивать со следующим $Date2 ниже с использованием простого

if ($Date1 -lt $Date2)
{
    Write-Host Date1 is before Date2
}

, тогда Write-Host будет оправдано. Это ожидаемое поведение.

$Date2 = Get-Date -Format "dd/MM/yyyy HH:mm:ss" -Day 31 -Hour 08 -Minute 30 -Month 12 -Second 00 -Year 2021

Если $Date2 было изменено на следующее:

$Date2 = Get-Date -Format "dd/MM/yyyy HH:mm:ss" -Day 01 -Hour 08 -Minute 30 -Month 1 -Second 00 -Year 2022  

Оператор if не будет выполнять Write-Host, хотя переменная $Date2 по-прежнему после $Date1.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Если вы хотите сравнить даты, удалите Format из вашего Get-Date. Когда вы используете Format, вы получаете строку вместо DateTime объекта:

PS> $Date1 = Get-Date -Format "dd/MM/yyyy HH:mm:ss" -Day 31 -Hour 07 -Minute 30 -Month 12 -Second 00 -Year 2021
PS> $Date1.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

Когда вы удаляете Format, вы получаете DateTime и можете напрямую сравнивать:

PS> $Date1 = Get-Date -Day 31 -Hour 07 -Minute 30 -Month 12 -Second 00 -Year 2021
PS> $Date1.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType

PS> $Date2 = Get-Date -Day 31 -Hour 08 -Minute 30 -Month 12 -Second 00 -Year 2021
PS> $Date3 = Get-Date -Day 01 -Hour 08 -Minute 30 -Month 1 -Second 00 -Year 2022
PS> $date1 -lt $date2
True
PS> $date1 -lt $date3
True
0 голосов
/ 10 октября 2019

когда вы используете Get-Date с -Format powershell сравнивает первый элемент в формате (в вашем случае 'dd'). PowerShell сопоставляет дату в том порядке, в котором вы упомянули -format. например, если обе даты равны, то будут проверяться месяцы и так далее. Есть два решения: вы можете удалить формат и использовать, например,

$Date1=get-date 2021-31-02 
$date2=get-date 2022-01-01
if ($Date1 -lt $Date2){
    Write-Host "Date1 is before Date2" 
}
else{
    Write-Host "Date1 is after Date2"
}

, или вы можете изменить -format, который лучше всего подходит для вашего использования.

$Date1 = Get-Date -Format "yyyy/MM/dd HH:mm:ss" -Day 31 -Hour 07 -Minute 30 -Month 1 -Second 00 -Year 2021
$Date2 = Get-Date -Format "yyyy/MM/dd HH:mm:ss" -Day 01 -Hour 08 -Minute 30 -Month 1 -Second 00 -Year 2022 
 if ($Date1 -lt $Date2){
        Write-Host "Date1 is before Date2" 
    }
    else{
        Write-Host "Date1 is after Date2"
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...