قل كلمة عن علامات التجزئة المختلفة أو كيف لا تحصل على خطأ في Powershell عند العمل مع Get-Date

يوم جيد ، عشاق باورشيل.

أحبه ، واليوم لاحظت غرابة واحدة دفعتني إلى كتابة هذا المقال. أعتقد أنك سوف تكون مهتمة جدا. حالة القراد الزائدة. إذا كنت مهتمًا ، مرحبًا بك في Cat:

ما هو جوهر الغرابة؟

في معالجة واحدة ، من أجل راحة الاختيار ، كان هناك حاجة إلى عدد الأيام حتى نهاية الشهر.

تم حساب هذا في سطر واحد من هذا النوع:

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

ما هو مميز هو حسابه يمكن أن تعطي نتائج مختلفة:

في البداية ، اعتقدت أن هناك خطأ ما في الشفرة ، أو في إصدار Powershell.

راجعت على العديد من السيارات وأدركت أن الوضع قابل للتكرار.

لذلك ، جلست لاول مرة وكتابة وظيفة.

حصلت على هذا ، التعليقات تذهب على الفور إلى الكود:

 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) 

حسنًا ، بعد أن كتبت ، جلست للتفكير وتوصلت إلى هذا السطر:

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

لم تخطئ ، لكن ربما ، لأنه:

اتضح أننا لا نأخذ في الاعتبار ساعة \ دقيقة \ ثانية ، أو بالأحرى علامات ساعة المعالج.
لاحظ أن Get-date تقوم بإرجاع قيمة بالمللي ثانية.

ولكن إذا ، عند إجراء العمليات الحسابية ، سقطت استدعاء Get-date الأولى والثانية على علامة واحدة ، فستكون هناك مثل هذه القيم:

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

اطرح واحصل على 30: 00: 00: 000
ولكن إذا كانت الدعوة إلى Get-date الثاني تقع في علامة التجزئة التالية ، فستكون قيمتها
=>
 1.11.2019 15:33:00:501 

ثم نحصل على القيمة في
 29 23:59:59:999 

الآن بعد العثور على المشكلة ، يمكننا القيام بذلك:

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

وسيكون لدينا دائما نفس المعنى.

كن حذرا ويكون عطلة نهاية أسبوع جيدة!

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


All Articles