Ucapkan kata tentang kutu yang berbeda atau bagaimana tidak mendapatkan kesalahan di Powershell saat bekerja dengan Get-Date

Selamat siang, pecinta Powershell.

Saya mencintainya, dan hari ini saya melihat satu keanehan yang memotivasi saya untuk menulis posting ini. Saya pikir Anda akan tertarik juga. Kasus centang berlebih. Jika tertarik, selamat datang di kucing:

Apa inti dari keanehan?

Dalam satu pemrosesan, untuk kenyamanan pemilihan, jumlah hari sampai akhir bulan diperlukan.

Ini dihitung dalam satu baris dari jenis ini:

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

Apa yang khas adalah perhitungannya dapat memberikan hasil yang berbeda:

Pada awalnya, saya pikir ada yang salah dengan kode, atau dengan versi Powershell.

Saya memeriksanya di beberapa mobil dan menyadari bahwa situasinya dapat direproduksi.

Karena itu, saya duduk untuk debut dan menulis suatu fungsi.

Saya mendapatkan ini, komentar segera masuk ke kode:

 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) 

Nah, setelah saya menulis, saya duduk untuk berpikir dan sampai pada baris ini:

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

Dia tidak memberikan kesalahan, tapi mungkin, karena:

Ternyata kami tidak memperhitungkan jam \ menit \ detik, atau lebih tepatnya jam prosesor berdetak.
Perhatikan bahwa Get-date mengembalikan nilai dalam milidetik.

Tetapi jika, saat melakukan perhitungan, panggilan Get-date pertama dan kedua jatuh pada satu centang, maka nilai-nilai ini adalah:

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

Kurangi dan dapatkan 30 00: 00: 00: 000
Tetapi jika panggilan ke Get-date kedua jatuh pada tick berikutnya, maka nilainya akan menjadi
=>
 1.11.2019 15:33:00:501 

Dan kemudian kita mendapatkan nilainya
 29 23:59:59:999 

Sekarang masalah ditemukan, kita dapat melakukan ini:

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

Dan kita akan selalu memiliki arti yang sama.

Berhati-hatilah dan selamat menikmati akhir pekan!

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


All Articles