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
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:
Dan kita akan selalu memiliki arti yang sama.
Berhati-hatilah dan selamat menikmati akhir pekan!