Get-VETimeSpanTimestamps.ps1

function Get-VETimeSpanTimestamps {
    <#
        .SYNOPSIS
            Return start and end timestamps for a timespan
        .DESCRIPTION
            Return start and end timestamps for a timespan
        .INPUTS
            The VE timespan object can be piped to the function
        .EXAMPLE
            $VETimeSpan | Get-VEDateTimeOffsets
            Example of how to get start and end timestamps for a timespan
        .NOTES
            Author: Decembry Quentin
    #>

    [CmdletBinding(DefaultParameterSetName='TimeSpan')]
    [OutputType([PSCustomObject])]
    [Alias()]
    param(
        # The VE timespan
        # Default: Last24Hours
        [Parameter(Mandatory=$false,ValueFromPipeline=$true,ParameterSetName='TimeSpan')] [VictronEnergy.TimeSpan] $TimeSpan = [VictronEnergy.TimeSpan]::Last24Hours,
        
        # Start time
        # Default: (Get-Date -Second 0 -Millisecond 0).AddDays(-1) -> Yesterday
        [Parameter(Mandatory=$false,ParameterSetName='DateTime')] [DateTime] $StartTime = (Get-Date -Second 0 -Millisecond 0).AddDays(-1),
        
        # End time
        # Default: (Get-Date -Second 0 -Millisecond 0) -> Now
        [Parameter(Mandatory=$false,ParameterSetName='DateTime')] [DateTime] $EndTime = (Get-Date -Second 0 -Millisecond 0)
    )

    begin {
        if ($PSBoundParameters['Debug']) {
            $DebugPreference = 'Continue'
        }
        
        if ($MyInvocation.MyCommand.ModuleName) { 
            $Private:ThisFunction = '{0}::{1}' -f $MyInvocation.MyCommand.ModuleName, $MyInvocation.MyCommand.Name
        } else {
            $Private:ThisFunction = '{0}::{1}' -f (Get-PSCallStack)[0].ScriptName, $MyInvocation.MyCommand.Name
        }
        
        Write-Debug "[$Private:ThisFunction] Begin"
    }
    
    process {
        Write-Debug "[$Private:ThisFunction] Process timespan $TimeSpan"
        switch ($PSCmdlet.ParameterSetName) {
            'TimeSpan' {
                switch ($TimeSpan) {
                    'LastHour' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddHours(-1)
                    }
                    'Last3Hours' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddHours(-3)
                    }
                    'Last6Hours' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddHours(-6)
                    }
                    'Last12Hours' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddHours(-12)
                    }
                    'Last24Hours' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddHours(-24)
                    }
                    'Last2Days' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-2)
                    }
                    'Last7Days' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-7)
                    }
                    'Last30Days' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-30)
                    }
                    'Last90Days' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-90)
                    }
                    'Last6Months' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddMonths(-6)
                    }
                    'LastYear' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddYears(-1)
                    }
                    'Today' {
                        $EndTime = Get-Date -Second 0 -Millisecond 0
                        $StartTime = Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0
                    }
                    'Yesterday' {
                        $EndTime = Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-1)
                    }
                    'TheDayBefore' {
                        $EndTime = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays(-1)
                        $StartTime = $EndTime.AddDays(-1)
                    }
                    'ThisDayLastWeek' {
                        $EndTime = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0).AddDays(-6)
                        $StartTime = $EndTime.AddDays(-1)
                    }
                    'ThisWeek' {
                        $EndTime = Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-$EndTime.DayOfWeek+1)
                    }
                    'PreviousWeek' {
                        $EndTime = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0)
                        $EndTime = $EndTime.AddDays(-$EndTime.DayOfWeek+1)
                        $StartTime = $EndTime.AddDays(-7)
                    }
                    'ThisMonth' {
                        $EndTime = Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-$EndTime.Day+1)
                    }
                    'PreviousMonth' {
                        $EndTime = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0)
                        $EndTime = $EndTime.AddDays(-$EndTime.Day+1)
                        $StartTime = $EndTime.AddMonths(-1)
                    }
                    'ThisYear' {
                        $EndTime = Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0
                        $StartTime = $EndTime.AddDays(-$EndTime.DayOfYear+1)
                    }
                    'PreviousYear' {
                        $EndTime = (Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0)
                        $EndTime = $EndTime.AddDays(-$EndTime.DayOfYear+1)
                        $StartTime = $EndTime.AddYears(-1)
                    }
                    default {
                        throw "Unsupported timespan '$_'"
                    }
                }
            }
            'DateTime' {
                Write-Debug "[$Private:ThisFunction] Dates validation"
                
                Write-Debug "[$Private:ThisFunction] Strip seconds and milliseconds"
                $StartTime = Get-Date $StartTime -Second 0 -Millisecond 0
                $EndTime = Get-Date $EndTime -Second 0 -Millisecond 0
                
                if ($EndTime -eq $StartTime) {
                    Write-Warning "[$Private:ThisFunction] Start and end time are equal"
                } elseif ($EndTime -lt $StartTime) {
                    Write-Warning "[$Private:ThisFunction] End date is before start date. Running automatic correction."
                    $tmp = $EndTime
                    $EndTime = $StartTime
                    $StartTime = $tmp
                }
            }
            default {
                throw "Unsupported parameter set name '$_'"
            }
        }
        
        [PSCustomObject] @{
            PSTypeName = 'VictronEnergy.TimeSpanTimestamps'
            Start = ([System.DateTimeOffset]$StartTime.ToUniversalTime()).ToUnixTimeSeconds()
            End = ([System.DateTimeOffset]$EndTime.ToUniversalTime()).ToUnixTimeSeconds()
        }
    }
    
    end {
        Write-Debug "[$Private:ThisFunction] End"
    }
}

# SIG # Begin signature block
# MIIIbQYJKoZIhvcNAQcCoIIIXjCCCFoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUUYFGDL5hUlK3wg2AhzxNzu37
# ZzOgggX4MIICYjCCAgigAwIBAgITXwAAAAITcsrrTJecaQAAAAAAAjAKBggqhkjO
# PQQDAjAkMQswCQYDVQQGEwJCRTEVMBMGA1UEAxMMSG9tZSBSb290IENBMB4XDTIy
# MDUwNTE0MDMxOFoXDTMyMDUwNTE0MTMxOFowJzELMAkGA1UEBhMCQkUxGDAWBgNV
# BAMTD0hvbWUgSXNzdWluZyBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDOT
# aIIU+QU7LfsmyPqGkCf53SrJuaBPpb5iVILCvG3cQxL6vgIZaGRaKlzYO+lq3CnN
# b4rtJW2d7rlTeehXtpWjggEUMIIBEDAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4E
# FgQUYf1/nMEp3Df+Nzi+Hvk7FymPsrMwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD
# AEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUfSS6
# P6qin/3ibmvelGJQhV1r1VgwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL3BraS5x
# ZWRpbnV4LmJlL0hvbWUlMjBSb290JTIwQ0EuY3JsMEYGCCsGAQUFBwEBBDowODA2
# BggrBgEFBQcwAoYqaHR0cDovL3BraS5xZWRpbnV4LmJlL0hvbWUlMjBSb290JTIw
# Q0EuY3J0MAoGCCqGSM49BAMCA0gAMEUCIERRzfMu3vx9vb+Apud4sDkOEKhKrCEl
# gSsedbjZRJ+YAiEA8BBaOqhnbnsUBIX2nty77euunwoAHrCuWzab5xJiy0UwggOO
# MIIDM6ADAgECAhNRAAAAMJpCm89a8zgYAAAAAAAwMAoGCCqGSM49BAMCMCcxCzAJ
# BgNVBAYTAkJFMRgwFgYDVQQDEw9Ib21lIElzc3VpbmcgQ0EwHhcNMjIwNzExMDc0
# NzQ3WhcNMjQwNzExMDc1NzQ3WjAbMRkwFwYDVQQDExBEZWNlbWJyeSBRdWVudGlu
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjALWtmJ1AQG77y9rUBbT
# HXR9FZokTP01bBWfNzk4Kenr/Xpm7Jt09PqLoNS8ToWWKRz9EkM+jg7lnLljWKcO
# G+fT1TbaEwxOpncugnbrioQQonbdWpyn0P7PxlqjUQdWd5Z7xQ0Z8RO3vvERWtDA
# L9QH0VBHNK4WqdWh3ElV6ogJUsy5hYxVTIU0K5VEYkIT4qvqq0RdajKavGWIr57R
# EsYv52Jcyh9FNgZKGdu9NwSKZUvkwHxGsI8zmwfP1I6QRkzsqPXlpk7A8NTD3+h+
# 4Y5AprRFyAWrVNYH+UQQe2D/PjjbKtfsU9xzG9EnqJF09pVRchapis+8DbfWnoC8
# iQIDAQABo4IBfTCCAXkwOgYJKwYBBAGCNxUHBC0wKwYjKwYBBAGCNxUIhorlOcPr
# DIadiwndkzuHjPAAPqb1CYWVxXgCAWQCAQowEwYDVR0lBAwwCgYIKwYBBQUHAwMw
# DgYDVR0PAQH/BAQDAgeAMBsGCSsGAQQBgjcVCgQOMAwwCgYIKwYBBQUHAwMwHQYD
# VR0OBBYEFAkUh200U2U2epAoy2ZvT7nwAYGBMB8GA1UdIwQYMBaAFGH9f5zBKdw3
# /jc4vh75Oxcpj7KzMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9wa2kucWVkaW51
# eC5iZS9Ib21lJTIwSXNzdWluZyUyMENBLmNybDBJBggrBgEFBQcBAQQ9MDswOQYI
# KwYBBQUHMAKGLWh0dHA6Ly9wa2kucWVkaW51eC5iZS9Ib21lJTIwSXNzdWluZyUy
# MENBLmNydDAuBgNVHREEJzAloCMGCisGAQQBgjcUAgOgFQwTRGVjZW1icnkuUUBo
# b21lLmxhbjAKBggqhkjOPQQDAgNJADBGAiEAh39vHCgqIDL4XazyHPiChMbu0by+
# aFP7rdzlJmM0K6ACIQCaP4CXolxlzdfkJsoIoDIJUrunYIlZ0yxs9OSnG1qmCjGC
# Ad8wggHbAgEBMD4wJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMTD0hvbWUgSXNzdWlu
# ZyBDQQITUQAAADCaQpvPWvM4GAAAAAAAMDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGC
# NwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUKXabaDsm
# JV8ra9qNvJSsk8p/JVQwDQYJKoZIhvcNAQEBBQAEggEADPUgPQwg2445Colk2ni1
# Jxx8aanMvpn/k+mYw9luvFENMW3IhdeIwLiWdwQd0MIaNX08lIC6Qa3dOHZFXYeR
# Xd5t2zZLOaHl9uL4h2jHRT4YvmdkEnLJMbcKyFTBHGkZ3QE4FYXn9xHjdSnUXKSk
# V2L5Z+IqesfDCrQEKbCH7jSpYluTGAaRT+aESmPD7U50LBttCAQ33hcbnnpg2Lcw
# uaVSn8FDo6joTqvDPVQkwj5iH+mbUu9BX1hP+lrBufRtJobd5Dd9kY52D6DG2xfm
# Q+oRsHOiXjYBEZ5uQ4FrKLyVMFVlb/pwCuz98Ii2K7HrkVB0tp5L7eGqVd7iSFle
# 0w==
# SIG # End signature block