【问题标题】:powershell "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime带有“3”参数的powershell“ParseExact”:“字符串未被识别为有效的日期时间
【发布时间】:2020-12-23 20:36:58
【问题描述】:

当我尝试解析 IIS 日志文件中的一行并将日期时间拉到该行时,我收到以下错误

使用“3”个参数调用“ParseExact”的异常:“字符串不是 识别为有效的日期时间。”在 line:9 char:1

  • $dateTime = [datetime]::ParseExact($dateTimeString, 'yyyy-MM-dd HH:mm ...
  •   + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
      + FullyQualifiedErrorId : FormatException
    

这是我的 powershell 代码:

$line = '2020-12-23 02:01:16.244 -06:00 [Information] 2020-12-23T08:01:16.2446161Z:     [Error] Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Connection request timed out'
$dateTimeString = [regex]::Matches($line, '\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d')[0].Groups[1].Value
write-host "datetimestr:" $dateTimeString
$provider = New-Object System.Globalization.CultureInfo "en-US"
$dateTime = [datetime]::ParseExact($dateTimeString, 'yyyy-MM-dd HH:mm:ss', $provider)

write-host $dateTime
$dateTime -f 'MM/dd/yyyy HH:mm:ss' | write-host 

我想我需要一些新鲜的眼睛来看看我错过了什么。

注释:

  • 我已尝试复制并粘贴 $line var 中的字符串以验证日期时间中没有奇怪的字符
  • 我尝试将 .trim 添加到 $line 中,但没有帮助
  • 我还将正则表达式模式缩小到 '\d\d\d-\d\d-\d\d' 和 parseexact() 到 ($dateTimeString, 'yyyy-MM-dd', $provider)这也无济于事。

【问题讨论】:

    标签: regex powershell datetime


    【解决方案1】:

    只是为了提供一个不需要复杂正则表达式的更简单的解决方案:

    $line = '2020-12-23 02:01:16.244 -06:00 [Information] 2020-12-23T08:01:16.2446161Z:     [Error] Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Connection request timed out'
    
    [datetime] ((-split $line)[0..1] -join ' ')
    
    • -splitstring-splitting operator 用于将行拆分为空格分隔的标记,前两个标记 ([0..1]) 以空格连接。

    • [datetime] 是一种将日期时间字符串转换为[datetime] (System.DateTime) 实例的culture-invariant 方式;这种文化不变的方式是基于InvariantCulture,它基于美英文化。

    【讨论】:

      【解决方案2】:

      你可以使用

      $dateTimeString = [regex]::Match($line, '\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d').Value
      

      您的 [regex]::Matches($line, '\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d')[0].Groups[1].Value 代码将日期时间子字符串匹配到组 0。您正在尝试使用 .Groups[1].Value 获取组 1 值,但模式中没有定义捕获组。

      请注意,不需要使用 Matches 来获取字符串中的所有匹配项,因为您只需要第一个匹配项,只需 Match 即可完成。

      另外,在正则表达式中重复四次\d 确实是多余的,您可以使用{4} limiting quantifier

      如果您只想在字符串的开头找到匹配项,请在开头添加^'^\d{4}-\d\d-\d\d\s\d\d:\d\d:\d\d'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        相关资源
        最近更新 更多