比较字符串中的日期和当前日期

时间:2019-11-11 06:59:10

标签: powershell

我有一个包含日期的字符串,我想将过去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 个答案:

答案 0 :(得分:2)

您可以拆分$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")
}

答案 1 :(得分:1)

我认为您应该始终将日期与日期进行比较,而不是将它们的字符串表示形式进行比较,除非它位于Sortable format中。

下面的代码从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的注释,如果Description字符串不包含要解析的日期,则下面使用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.)"
    }
}