Public/Test-IsExpired.ps1

Function Test-IsExpired {
    <#
        .Synopsis
            Check if a date is older than N minutes from now.
        .Description
            Compare the current time with a DateTime or date string, checking if
            more than the specified number of minutes have elapsed (i.e. is expired).
        .Parameter Date
            A DateTime object
        .Parameter DateString
            A date/time string (e.g. '20240115120000')
        .Parameter DateStringFormat
            Format of DateString (default: 'yyyyMMddHHmmss')
        .Parameter Minutes
            TTL in minutes after which the date is considered expired
        .Example
            $fiveMinutesAgo = (Get-Date).AddMinutes(-5)
            Test-IsExpired -Date $fiveMinutesAgo -Minutes 3
            # Returns: $true (5 min ago > 3 min TTL)
        .Example
            $fiveMinutesAgo = (Get-Date).AddMinutes(-5)
            Test-IsExpired -Date $fiveMinutesAgo -Minutes 10
            # Returns: $false (5 min ago < 10 min TTL)
    #>

    [CmdletBinding(DefaultParameterSetName = 'datetime')]
    [OutputType([bool])]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'datetime')]
        [datetime]$Date,

        [Parameter(Mandatory = $true, ParameterSetName = 'datestring')]
        [string]$DateString,
        [Parameter(Mandatory = $false, ParameterSetName = 'datestring')]
        [string]$DateStringFormat = 'yyyyMMddHHmmss',

        [Parameter(Mandatory = $false)]
        [int]$Minutes = 0
    )
    Begin {
        $expired = $true
    }
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            "datetime" {
                $DateTime = $Date
            }
            "datestring" {
                $DateTime = [datetime]::ParseExact($DateString, $DateStringFormat, $null)
            }
        }
        $Span = New-TimeSpan -Minutes $Minutes
        if ((Get-Date) -le $DateTime + $Span) {
            $expired = $false
        }
    }
    End {
        return $expired
    }
}