我试图简单地计算用户密码到期前的天数。我使用TimeSpan来做到这一点。我的实践代码如下:
(New-TimeSpan -Start (get-date -hour 0 -minute 0 -second 0) -End (Get-Date $_.PasswordLastSet -hour 0 -minute 0 -second 0).AddDays(90)).Days
因此,如果当前日期是最后一次设置密码的日期后90天,则密码到期的天数将为0.
不幸的是,此代码将连续几天返回相同的结果。出于某种原因,我似乎无法在这里获得完全一致的结果,我认为这取决于一天中的时间,但我不确定为什么。大多数时候,我们每隔一天都会跳过。因此,如果我们每周都运行这个,我们将返回4,4,2,2,0,0。
要轻松复制,您可以使用以下内容:
$x = (get-date).AddDays(-90)
(New-TimeSpan -Start (get-date $x -hour 0 -minute 0 -second 0).AddDays(90) -End (get-date -hour 0 -minute 0 -second 0)).Days
(New-TimeSpan -Start (get-date $x -hour 0 -minute 0 -second 0).AddDays(89) -End (get-date -hour 0 -minute 0 -second 0)).Days
答案 0 :(得分:3)
好的,我找到了。这取决于毫秒。有时差异将是1天和几毫秒。有时,那几毫秒将会到达另一侧,因此差异将是23小时59分59秒78毫秒(例如)。这显示为0天!
要查看它,只需从示例中删除.Hours
并尝试复制它。
New-TimeSpan -Start (get-date $x -hour 0 -minute 0 -second 0).AddDays(89) -End (get-date -hour 0 -minute 0 -second 0)
Days : 0
Hours : 23
Minutes : 59
Seconds : 59
Milliseconds : 78
Ticks : 863990781260
TotalDays : 0.999989330162037
TotalHours : 23.9997439238889
TotalMinutes : 1439.98463543333
TotalSeconds : 86399.078126
TotalMilliseconds : 86399078.126
要解决此问题,只需在计算中添加一秒钟,即可获得正确的天数。
答案 1 :(得分:2)
为什么这么难?您可以从90天前的日期中减去当前日期并检索TotalDays
:
(Get-Date) - (Get-Date).AddDays(-90) | Select-Object -ExpandProperty TotalDays
现在您只需检查结果是否为-le 90
。
注意:由于Igor发现TotalMilliseconds可能是您问题的根源,我建议仅检索一次的日期:
$date= Get-Date
$date - $date.AddDays(-90) | Select-Object -ExpandProperty TotalDays
然后你不必处理小时,分钟,Seonds,Miliseconds和Ticks。