Private/Date.ps1

function ConvertFrom-RfcUtcTimestamp {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Value
    )

    return ([DateTimeOffset]::Parse(
        $Value,
        [System.Globalization.CultureInfo]::InvariantCulture,
        [System.Globalization.DateTimeStyles]::RoundtripKind
    )).UtcDateTime
}

function ConvertFrom-RfcUtcTimestampOrNull {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Value
    )

    try {
        return (ConvertFrom-RfcUtcTimestamp -Value $Value)
    }
    catch {
        return $null
    }
}

function ConvertTo-Rfc3339UtcZ {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [object]$Timestamp
    )

    $dto = if ($Timestamp -is [DateTimeOffset]) {
        [DateTimeOffset]$Timestamp
    }
    elseif ($Timestamp -is [DateTime]) {
        [DateTimeOffset]::new(([DateTime]$Timestamp).ToUniversalTime())
    }
    else {
        [DateTimeOffset]::Parse(
            [string]$Timestamp,
            [System.Globalization.CultureInfo]::InvariantCulture,
            [System.Globalization.DateTimeStyles]::RoundtripKind
        ).ToUniversalTime()
    }

    # Produce UTC RFC3339 with trailing 'Z' (no fractional seconds for compactness)
    return $dto.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss'Z'")
}

function ConvertTo-FilesafeTimestamp {
    <#
    .SYNOPSIS
        Converts a timestamp to a Windows-safe filename string (replaces colons with dashes).
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [datetimeoffset]$Timestamp
    )

    return $Timestamp.UtcDateTime.ToString("o") -replace ':', '-'
}

function ConvertFrom-FilesafeTimestamp {
    <#
    .SYNOPSIS
        Converts a Windows-safe filename timestamp back to ISO 8601 format for parsing.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Value
    )

    return $Value -replace 'T(\d{2})-(\d{2})-(\d{2})', 'T$1:$2:$3'
}