PowerShell равных дат не равно - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь сравнить две даты, если они не равны, я записываю текущую дату в текстовый файл, но я всегда получаю две разные даты, даже если я сейчас пишу новую дату в файл.

$lastBackup=Get-Date (Get-Content -Path last_backup.txt)
"First date is: $lastBackup"
write-host

$lastModified = Get-Date ((Get-Item "My folder").LastWriteTime)
"Second date is: $lastModified"
write-host

if ($lastBackup -ne $lastModified)
{
    Set-Content -Path .\last_backup.txt -Value $lastModified -NoNewline
    "Dates are not equal"
    write-host
}

Выход:

First date is: 03/13/2019 23:35:17

Second date is: 03/13/2019 23:35:17

Dates are not equal

$ lastBackup и $ lastModified являются объектами DateTime. Что не так с этим скриптом?

Ответы [ 2 ]

1 голос
/ 14 марта 2019
  • Как правило, из строки представления [datetime] (System.DateTime) нельзя сделать вывод, точно ли они равны .

    • Точная точка времени, хранящаяся в экземпляре [datetime], обычно не полностью , отраженная в строковых представлениях.
  • Два [datetime] экземпляра считаются равными, только если их значения свойства .Ticks равны.

    • Свойство .Ticks содержит [long] (System.Int64) значение, которое выражает точку во времени в интервалах 100 наносекунд с полуночи 1 января года 1 нашей эры в григорианском календаре.

Поэтому, если выхотите сравнить [datetime] экземпляров (только что названных даты в обсуждении ниже) при более высоком уровне детализации , дополнительная работанеобходимо:

Используйте соответствующие Get-Date параметры для установки всех нижних уровней гранулarity к 0:

Например, к сравните даты с гранулярностью секунд (чтобы увидеть, попадают ли они в одну и ту же календарную секунду), установите для компонента -MilliSecond значение 0:

$dtNow = Get-Date
$dtNowAgain = Get-Date

# This - predictably - returns $false, because the dates aren't exactly equal,
# given that the date values will at least differ by milliseconds, and
# possibly also by the seconds value.
$dtNow -eq $dtNowAgain

# You can abstract away the difference by setting the milliseconds
# component to 0 - this will *typically* return $true
# NOTE: If a new calendar second happened to start between setting $dtNow
#       and $dtNowAgain, this will return $false.
(Get-Date $dtNow -MilliSecond 0) -eq (Get-Date $dtNowAgain -MilliSecond 0)

К сравните на уровне минут (чтобы увидеть,они оба попадают в одну и ту же календарную минуту), вы должны установить оба -Second и -MilliSecond на 0:

# This will *typically* return $true.
# NOTE: If a new calendar minute happened to start between setting $dtNow
#       and $dtNowAgain, this will return $false.
(Get-Date $dtNow -Second 0 -MilliSecond 0) -eq (Get-Date $dtNowAgain -Second 0 -MilliSecond 0)

Примечание: Преимущество вышеуказанного подхода перед сравнением на основе строк состоит в том, что в конечном итоге он все еще выполняет числовых сравнений , так что не только равенство работает(-eq), но также неравенство тестирование (-lt / -le / -gt / -ge), а также сортировка .

0 голосов
/ 14 марта 2019

Округление дат до секунд / минут / 5 минут и т. Д. Перед сравнением. Вы можете сделать либо:

$date = Get-Date
$date.ToString("yyyy-MM-dd HH:mm:ss.fff")
$roundedDate = Get-Date -Year $date.Year -Month $date.Month -Day $date.Day -Hour $date.Hour -Minute $date.Minute -Second $date.Second -Millisecond 0
$roundedDate.ToString("yyyy-MM-dd HH:mm:ss.fff")

или посмотрите эту ссылку https://jrich523.wordpress.com/2011/10/03/rounding-a-date-in-powershell/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...