Dites un mot sur les différentes tiques ou comment ne pas obtenir d'erreur dans Powershell lorsque vous travaillez avec Get-Date

Bonjour, amoureux de Powershell.

Je l'aime et aujourd'hui j'ai remarqué une bizarrerie qui m'a motivé à écrire ce post. Je pense que ça vous intéressera aussi. Le cas de l'excès de tique. Si vous êtes intéressé, bienvenue au chat:

Quelle est l'essence de l'étrangeté?

En un seul traitement, pour faciliter la sélection, le nombre de jours jusqu'à la fin du mois était nécessaire.

Cela a été calculé sur une ligne de ce type:

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

Ce qui est caractéristique, c'est que son calcul peut donner des résultats différents:

Au début, je pensais que quelque chose n'allait pas avec le code ou avec la version Powershell.

Je l'ai vérifié sur plusieurs voitures et j'ai réalisé que la situation était reproductible.

Par conséquent, je me suis assis pour faire mes débuts et écrire une fonction.

J'ai compris, les commentaires vont immédiatement au 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) 

Eh bien, après avoir écrit, je me suis assis pour réfléchir et je suis arrivé à cette ligne:

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

Elle n'a pas donné d'erreur, mais peut-être parce que:

Il s'avère que nous ne prenons pas en compte l'heure \ minute \ seconde, ou plutôt l'horloge du processeur.
Notez que Get-date renvoie une valeur en millisecondes.

Mais si, lors de l'exécution des calculs, le premier et le deuxième appel Get-date tombaient sur un tick, alors il y aurait de telles valeurs:

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

Soustrayez et obtenez 30 00: 00: 00: 000
Mais si l'appel à la deuxième Get-date tombe au prochain tick, alors sa valeur sera
=>
 1.11.2019 15:33:00:501 

Et puis nous obtenons la valeur
 29 23:59:59:999 

Maintenant que le problème est trouvé, nous pouvons le faire:

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

Et nous aurons toujours la même signification.

Soyez prudent et passez un bon week-end!

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


All Articles