Sagen Sie ein Wort über verschiedene Zecken oder wie Sie bei der Arbeit mit Get-Date keinen Fehler in Powershell erhalten

Guten Tag, Powershell-Liebhaber.

Ich liebe ihn und heute habe ich eine Kuriosität bemerkt, die mich motiviert hat, diesen Beitrag zu schreiben. Ich denke, Sie werden auch interessiert sein. Der Fall von überschüssiger Zecke. Bei Interesse herzlich willkommen bei cat:

Was ist das Wesen der Fremdheit?

In einer Verarbeitung wurde zur Vereinfachung der Auswahl die Anzahl der Tage bis zum Monatsende benötigt.

Dies wurde in einer Zeile dieser Art berechnet:

((Get-date -Day 1).AddMonths(1)-(get-date)).days-1 

Charakteristisch ist, dass die Berechnung zu unterschiedlichen Ergebnissen führen kann:

Zuerst dachte ich, dass etwas mit dem Code oder der Powershell-Version nicht stimmt.

Ich habe es an mehreren Autos überprüft und festgestellt, dass die Situation reproduzierbar ist.

Deshalb habe ich mich hingesetzt, um zu debütieren und eine Funktion zu schreiben.

Ich habe das bekommen, die Kommentare gehen sofort zum Code:

 Function Get-DaysToEndOfMonths([int]$Month=1) {If($Month -lt 1){[int]$Month = 1} $CurrentDate = get-date #   $CurrentDay = $CurrentDate.day #    $FirstDayCurrentMonths = (Get-date -Day 1) #    #$FirstDayNextMonths = $FirstDayCurrentMonths.AddMonths($Month) #    #,      ,        $LastDay = $FirstDayCurrentMonths.AddMonths($Month).AddDays(-1) #    $DaysToEndOfMonths = $($LastDay - $CurrentDate).Days #     #  New-TimeSpan #$NewTimeSpan = New-TimeSpan -Start $CurrentDate -End $LastDay #$DaysToEndOfMonths = $NewTimeSpan.Days #  Write-debug "$DaysToEndOfMonths days to the end of the next $Month month" } Get-DaysToEndOfMonths(1) 

Nun, nachdem ich geschrieben hatte, setzte ich mich zum Nachdenken hin und kam zu dieser Zeile:

 [int]((((Get-Date -day 01).AddMonths(1)).AddDays(-1)).Day-(Get-date).Day) 

Sie hat keinen Fehler gemacht, aber vielleicht, weil:

Es stellt sich heraus, dass wir die Stunde \ Minute \ Sekunde oder vielmehr die Prozessortakt-Ticks nicht berücksichtigen.
Beachten Sie, dass Get-date einen Wert in Millisekunden zurückgibt.

Wenn jedoch bei der Durchführung der Berechnungen der erste und der zweite Get-Date-Aufruf auf einen Tick fielen, gibt es folgende Werte:

 (Get-date -day 1).AddMonth(1) = 1.12.2019 15:33:00:500 Get-date = 1.11.2019 15:33:00:500 

Subtrahieren und 30 00: 00: 00: 000 erhalten
Wenn der Aufruf des zweiten Get-Datums jedoch auf das nächste Häkchen fällt, ist sein Wert
=>
 1.11.2019 15:33:00:501 

Und dann bekommen wir den Wert in
 29 23:59:59:999 

Nachdem das Problem gefunden wurde, können wir Folgendes tun:

 #     ((((Get-Date -day 01).AddMonths(1)).AddDays(-1))-(Get-date -Hour 0 -Minute 0 -Second 0 -Millisecond 0)).Days 

Und wir werden immer die gleiche Bedeutung haben.

Sei vorsichtig und wünsche dir ein schönes Wochenende!

Source: https://habr.com/ru/post/de474204/


All Articles