functions/private/Parse-Date.ps1
|
function Parse-Date { <# .SYNOPSIS Robust date/time parser that accepts multiple common formats and returns a [DateTime] .DESCRIPTION Tries a list of common date formats using invariant culture, then falls back to TryParse with invariant and current culture. Throws if input cannot be parsed. .PARAMETER InputDate A string or DateTime object to parse. .OUTPUTS [DateTime] #> [CmdletBinding()] param( [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [object]$InputDate ) process { if ($null -eq $InputDate -or $InputDate -eq '') { return $null } if ($InputDate -is [DateTime]) { return $InputDate } $s = $InputDate.ToString() $formats = @( 'yyyy-MM-dd HH:mm:ss', 'yyyy-MM-dd', 'MM/dd/yyyy HH:mm:ss', 'MM/dd/yyyy', 'M/d/yyyy', 'M/d/yyyy HH:mm:ss', 'yyyy-MM-ddTHH:mm:ss', 'yyyy-MM-ddTHH:mm:ssZ' ) foreach ($fmt in $formats) { try { return [DateTime]::ParseExact($s, $fmt, [System.Globalization.CultureInfo]::InvariantCulture) } catch { # ignore and try next format } } # Try parsing with invariant culture, then current culture try { return [DateTime]::Parse($s, [System.Globalization.CultureInfo]::InvariantCulture) } catch {} try { return [DateTime]::Parse($s) } catch {} throw "Invalid date format: $s" } } |