New-TimeSpan的两个午夜日期每隔一天跳过

时间:2017-05-17 15:09:52

标签: powershell

我试图简单地计算用户密码到期前的天数。我使用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

2 个答案:

答案 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。