我正在尝试比较两个日期,如果它们不相等,我会将当前日期写入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对象。 这个脚本怎么了?
答案 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/