DateTime TryParseExact завершается с ошибкой при передаче массива форматов в PowerShell
Выполнение следующего PowerShell возвращает false, когда я ожидал бы true:
$format = @('yyyy-MM-ddTHH:mm:ssZ', 'yyyy-MM-ddTHH:mm:sszzz', 'yyyy-MM-ddTHH:mm:ss')
$provider = [System.Globalization.CultureInfo]::InvariantCulture
$style = [System.Globalization.DateTimeStyles]::AllowWhiteSpaces -bor [System.Globalization.DateTimeStyles]::AssumeUniversal
$result = [DateTime]::MinValue
[DateTime]::TryParseExact('2020-01-01T12:01:00Z', $format, $provider, $style , [ref]$result)
# returns false
Я видел такое же поведение как с PowerShell (v5.1.19041.1682), так и с PWSH (v7.2.4).
Если я передам одно значение для параметра Format вместо массива, я получу ожидаемый результат:
$format = 'yyyy-MM-ddTHH:mm:ssZ'
$provider = [System.Globalization.CultureInfo]::InvariantCulture
$style = [System.Globalization.DateTimeStyles]::AllowWhiteSpaces -bor [System.Globalization.DateTimeStyles]::AssumeUniversal
$result = [DateTime]::MinValue
[DateTime]::TryParseExact('2020-01-01T12:01:00Z', $format, $provider, $style , [ref]$result)
# returns true
Это не ошибка в .net, так как запуск того же самого на С# работает точно так, как можно было бы ожидать (я также пытался запустить точный эквивалентный код, как указано выше):
void Main()
{
var formats = new []{"yyyy-MM-ddTHH:mm:ssZ", "yyyy-MM-ddTHH:mm:sszzz", "yyyy-MM-ddTHH:mm:ss"};
var provider = System.Globalization.CultureInfo.InvariantCulture;
var style = System.Globalization.DateTimeStyles.AllowWhiteSpaces | System.Globalization.DateTimeStyles.AssumeUniversal;
foreach (var testString in new[]{"", "2020-01-01T12:01:00", "2020-01-01T12:01:00Z", "2020-01-01T12:01:00+01:00", "2020-01-01 12:01:00"})
{
var result = DateTime.MinValue;
if (DateTime.TryParseExact(testString, formats, provider, style, out result))
{
Console.WriteLine($"Parsed '{testString}' as {result}");
}
else
{
Console.WriteLine($"Failed to parse '{testString}'");
}
}
}
Выход
Failed to parse ''
Parsed '2020-01-01T12:01:00' as 2020-01-01 12:01:00
Parsed '2020-01-01T12:01:00Z' as 2020-01-01 12:01:00
Parsed '2020-01-01T12:01:00+01:00' as 2020-01-01 11:01:00
Failed to parse '2020-01-01 12:01:00'