Functions/Get-LastDayInMonth.ps1

function Get-LastDayInMonth {
<#
.SYNOPSIS
    Get the last day of the month given the year as an integer, and the month as an integer
.DESCRIPTION
    Get the last day of the month given the year as an integer, and the month as an integer
.PARAMETER Year
    Integer in the range 1-9999, mandatory, accept value from pipeline by propertyname, aliased to 'Y'
.PARAMETER Month
    Integer in the range 1-12, mandatory, accept value from pipeline by propertyname, aliased to 'M'
.PARAMETER IncludeInput
    Switch to include the input in the output
.EXAMPLE
    Get-LastDayInMonth -Year 2020 -Month 2
 
    29
.EXAMPLE
    Get-LastDayInMonth -Year 2019 -Month 2
 
    28
.EXAMPLE
    Get-LastDayInMonth -Year 2019 -Month 2 -IncludeInput
 
    Year Month Days
    ---- ----- ----
    2019 2 28
.EXAMPLE
    new-object psobject -property @{Year=2000;Month=2} | Get-LastDayInMonth
 
    29
.EXAMPLE
    new-object psobject -property @{Y=2019;M=2} | Get-LastDayInMonth -IncludeInput
 
    Year Month Days
    ---- ----- ----
    2019 2 28
.NOTES
    Inspired by: https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/calculating-first-and-last-day-of-month
#>


    [cmdletbinding()]
    [outputtype('int')]
    param(
        [parameter(Mandatory, HelpMessage = 'Please enter a year in the range 1-9999', ValueFromPipelineByPropertyName)]
        [ValidateRange(1, 9999)]
        [Alias('Y')]
        [int] $Year,

        [parameter(Mandatory, HelpMessage = 'Please enter a month in the range 1-12', ValueFromPipelineByPropertyName)]
        [ValidateRange(1, 12)]
        [Alias('M')]
        [int] $Month,

        [switch] $IncludeInput
    )

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
    }

    process {
        $ReturnVal = [datetime]::DaysInMonth($Year, $Month)
        if ($IncludeInput) {
            New-Object -TypeName psobject -Property ([ordered] @{
                    Year  = $Year
                    Month = $Month
                    Days  = $ReturnVal
                })
        } else {
            Write-Output $ReturnVal
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }
}