Powershell等于日期不等于

时间:2019-03-13 21:30:17

标签: powershell

我正在尝试比较两个日期,如果它们不相等,我会将当前日期写入txt文件,但是即使我现在立即将新日期写入文件,我也总是会得到两个不同的日期。

$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 个答案:

答案 0 :(得分:1)

  • 通常无法从[datetime]System.DateTime)实例的 string 表示中推断它们是否完全相同。< / p>

    • 存储在[datetime]实例中的确切时间点通常不能完全反映在字符串表示中。
  • 只有两个[datetime]属性值相等时,两个.Ticks实例才被视为相等。

    • .Ticks属性包含一个[long]System.Int64)值,该值表示自公元1年1月1日午夜以来的100纳秒间隔的时间点。公历。

因此,如果要比较[datetime]个实例(在下面的讨论中仅称为 dates ),请以更高的级别粒度 ,还需要其他工作:

使用适当的Get-Date参数将所有较低级别的粒度设置为0

例如,要 的粒度比较日期(以查看它们是否属于同一日历秒),请设置{{1} }组成-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

注意:上述方法相对于基于 string 的比较的优势在于,它最终仍会执行数字比较,因此,不仅平等测试有效(# 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) ,但 inequality 测试也有效(-eq / -lt / -le / {{ 1}}),以及排序

答案 1 :(得分:0)

在比较之前,将日期舍入为秒/分钟/ 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/