Private/Yaml/Convert-DateTimeOffsetToDateTime.ps1
<# .SYNOPSIS Recursively converts DateTimeOffset instances to DateTime in a given object. .DESCRIPTION This function takes an input object and recursively traverses its structure. If it encounters any DateTimeOffset instances, it converts them to DateTime. It handles nested dictionaries and lists, ensuring that all DateTimeOffset instances are converted regardless of their depth in the object hierarchy. .PARAMETER InputObject The object to process, which may contain DateTimeOffset instances. .EXAMPLE $obj = @{ Date1 = [DateTimeOffset]::Now Nested = @{ Date2 = [DateTimeOffset]::UtcNow } List = @([DateTimeOffset]::Now, "string", 123) } $converted = Convert-DateTimeOffsetToDateTime $obj # $converted will have DateTime instances instead of DateTimeOffset. .NOTES This function is useful for ensuring compatibility with systems that expect DateTime rather than DateTimeOffset, such as certain serialization scenarios. #> function Convert-DateTimeOffsetToDateTime { param( [Parameter()] [AllowNull()] $InputObject ) if ($null -eq $InputObject) { return $null } if ($InputObject -is [DateTimeOffset]) { # Preserve naive timestamps (those without explicit zone) as 'Unspecified' kind so no offset is appended $dto = [DateTimeOffset]$InputObject return [DateTime]::SpecifyKind($dto.DateTime, [System.DateTimeKind]::Unspecified) } if ($InputObject -is [System.Collections.IDictionary]) { foreach ($k in @($InputObject.Keys)) { $InputObject[$k] = Convert-DateTimeOffsetToDateTime $InputObject[$k] } return $InputObject } if ($InputObject -is [System.Collections.IList]) { for ($j = 0; $j -lt $InputObject.Count; $j++) { $InputObject[$j] = Convert-DateTimeOffsetToDateTime $InputObject[$j] } return $InputObject } return $InputObject } |