Private/Update-ServiceNowDateTimeField.ps1

Function Update-ServiceNowDateTimeField {
    <#
    .SYNOPSIS
    Attempt to update statically set ServiceNow result fields from string to DateTime fields

    .DESCRIPTION
    Attempt to update statically set ServiceNow result fields from string to DateTime fields

    .EXAMPLE
    Update-ServiceNowDateTimeField -Result $Result

    .OUTPUTS
    System.Management.Automation.PSCustomObject

    .NOTES

    #>


    [OutputType([PSCustomObject[]])]
    [CmdletBinding(SupportsShouldProcess)]
    param (
        # Pipeline variable
        [Parameter(
            Mandatory         = $true,
            ValueFromPipeline = $true
        )]
        [ValidateNotNullOrEmpty()]
        [PSCustomObject[]]$Result
    )

    begin {}
    process    {
        # Convert specific fields to DateTime format
        $ConvertToDateField = @('closed_at', 'expected_start', 'follow_up', 'opened_at', 'sys_created_on', 'sys_updated_on', 'work_end', 'work_start')

        If ($PSCmdlet.ShouldProcess($SearchBase,$MyInvocation.MyCommand)) {
        ForEach ($SNResult in $Result) {
                ForEach ($Property in $ConvertToDateField) {
                    If (-not [string]::IsNullOrEmpty($SNResult.$Property)) {
                        Try {
                            # Extract the default Date/Time formatting from the local computer's "Culture" settings, and then create the format to use when parsing the date/time from Service-Now
                            $CultureDateTimeFormat = (Get-Culture).DateTimeFormat
                            $DateFormat = $CultureDateTimeFormat.ShortDatePattern
                            $TimeFormat = $CultureDateTimeFormat.LongTimePattern
                            $DateTimeFormat = "$DateFormat $TimeFormat"
                            $SNResult.$Property = [DateTime]::ParseExact($($SNResult.$Property), $DateTimeFormat, [System.Globalization.DateTimeFormatInfo]::InvariantInfo, [System.Globalization.DateTimeStyles]::None)
                        }
                        Catch {
                            Try {
                                # Universal Format
                                $DateTimeFormat = 'yyyy-MM-dd HH:mm:ss'
                                $SNResult.$Property = [DateTime]::ParseExact($($SNResult.$Property), $DateTimeFormat, [System.Globalization.DateTimeFormatInfo]::InvariantInfo, [System.Globalization.DateTimeStyles]::None)
                            }
                            Catch {
                                # If the local culture and universal formats both fail keep the property as a string (Do nothing)
                                $null = 'Code to make PSSA happy when we just want to suppress errors'
                            }
                        }
                    }
                }
            }
        }

        $Result
    }
    end {}
}