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'

0 ответов

Другие вопросы по тегам