Private/ConvertTo-CloudPCMaintenanceWindowTime.ps1

function ConvertTo-CloudPCMaintenanceWindowTime {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Value,

        [Parameter(Mandatory)]
        [string]$PropertyName
    )

    begin { }

    process {
        $match = [regex]::Match($Value, '^(?<hour>\d{2}):(?<minute>\d{2})(?::(?<second>\d{2})(?:\.(?<fraction>\d{1,7}))?)?$')
        if (-not $match.Success) {
            Write-Error "New-CloudPCMaintenanceWindow: $PropertyName must be HH:mm or a Graph time-of-day value."
            return
        }

        $hour = [int]$match.Groups['hour'].Value
        $minute = [int]$match.Groups['minute'].Value
        $second = if ($match.Groups['second'].Success) { [int]$match.Groups['second'].Value } else { 0 }
        $fraction = if ($match.Groups['fraction'].Success) {
            $match.Groups['fraction'].Value.PadRight(7, '0')
        }
        else {
            '0000000'
        }

        if ($hour -gt 23 -or $minute -gt 59 -or $second -gt 59) {
            Write-Error "New-CloudPCMaintenanceWindow: $PropertyName must be within a single day."
            return
        }

        $parsed = [timespan]::new(0, $hour, $minute, $second, 0).Add([timespan]::FromTicks([int64]$fraction))
        if ($parsed.TotalMinutes -lt 0 -or $parsed.TotalMinutes -ge 1440) {
            Write-Error "New-CloudPCMaintenanceWindow: $PropertyName must be within a single day."
            return
        }

        $parsed
    }

    end { }
}