Сравнить дату из строки с текущей датой - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть строка, содержащая дату, и я хочу сравнить эту дату всех последних 15 дней с датой в строке.

Я сохранил дату всех 15 дней в массиве и сравнил ее с датой в строке.

#last 15 days date.
$Q = @()
$Q = for ($i=15; $i -gt 1; $i--) {
    $date=Get-Date -DisplayHint Date #-Format "dd MMM yyyy"
    $final=$date.AddDays(-$i)
    $final.tostring("dd MMM yyyy")
}

# $array.'Description' have string like this "Enabled AD ID as per Call id: 509112 29 Oct 2019"

#comparing
if($array.'Description' -notcontains $Q){
Write-host ("true")
}else
{
write-host ("false")
}




Я хочу сравнить результат.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Я думаю, что вы всегда должны сравнивать даты с датами, а не с их строковым представлением, если оно не в Сортируемый формат .

Ниже код берет строку даты из атрибута Description и преобразует ее влокальный объект DateTime для сравнения:

$refDate = (Get-Date).AddDays(-15).Date  # midnight 15 days ago

$array | ForEach-Object {
    # parse a date object from the Description string
    $dateString = ([regex]'(\d{1,2} \w{3} \d{4})$').Match($_.Description).Groups[1].Value
    $date = [datetime]::ParseExact($dateString, 'd MMM yyyy', [cultureinfo]"en-US")
    # make it a Local date
    $date = [datetime]::SpecifyKind($date, 'Local')

    if ($date -gt $refDate) {
        # the description date is inside the last 15 days
        Write-Host "True"
    }
    else { Write-Host "False" }
}


Редактировать

Согласно комментарию Esperanto57 , в случае описаниястрока не содержит даты для анализа, ниже используется блок try{..} catch{..} для решения этой проблемы:

$array | ForEach-Object {
    try {
        # parse a date object from the Description string
        $dateString = ([regex]'(\d{1,2} \w{3} \d{4})$').Match($_.Description).Groups[1].Value
        $date = [datetime]::ParseExact($dateString, 'd MMM yyyy', [cultureinfo]"en-US")
        # make it a Local date
        $date = [datetime]::SpecifyKind($date, 'Local')
        if ($date -gt $refDate) {
            # the description date is inside the last 15 days
            Write-Host "True"
        }
        else { Write-Host "False" }
    }
    catch {
         Write-Host "False. (The Description attribute does not contain a date.)"
    }
}
1 голос
/ 11 ноября 2019

Вы можете разделить $array.'Description', затем соединить последние три элемента и затем сравнить его с $ Q.
($($array.'Description').Split(" ") | Select-Object -Last 3) -join " "
Сравнение будет выглядеть примерно так:

if ((($($array.'Description').Split(" ") | Select-Object -Last 3) -join " ") -notcontains $Q){
    Write-host ("true")
}else
{
    write-host ("false")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...