【问题标题】:DateTime ParseExact not working with all StringsDateTime ParseExact 不适用于所有字符串
【发布时间】:2015-03-06 09:48:29
【问题描述】:

我现在正在编写一个 PS 脚本,我需要使用一个函数将像“20141118133804”这样的字符串格式化为 DateTime:

Function Convert-Date ([string]$parseDate)
{        
    [regex]$r = "[^0-9]"
    [string]$parseDate = $r.Replace($parseDate,"")

    $convDate = [DateTime]::ParseExact($parseDate,"yyyyMMddhhmmss",$null)

    return $convDate
}

输出如下:

Mittoch,2014 年 11 月 5 日 09:45:22 Mittwoch, 16. 2014 年 7 月 04:51:38 Mittwoch,2014 年 8 月 6 日 05:35:16 Ausnahme beim Aufrufen von "ParseExact" mit 3 Argument(en): "字符串未被识别为 有效的日期时间。”在 C:\Users\xxx\Desktop\Get-RDS-CALs-Per-Device.ps1:34 Zeichen:5 + $convDate = [DateTime]::ParseExact($parseDate,"yyyyMMddhhmmss",$null) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : 格式异常

我已经尝试过更改 CultureInfo,但效果相同,没有。

你们中有人知道为什么会出现这个错误吗?

提前致谢。 问候和问候 IG

【问题讨论】:

    标签: .net parsing datetime powershell-4.0


    【解决方案1】:

    您可能正在尝试解析无效的日期字符串,或者您为输入指定了错误的格式。

    示例:

    • “20140229133804”无效,因为它引用了不存在的一天
    • “20141811133804”无效,因为它将月份与日期切换(关于您的格式“yyyyMMddhhmmss”)。请注意,这种情况适用于少于 12 天的情况,因此有时我们会遇到“随机”错误。
    • “20141118133866”无效,因为它试图在几秒内解析 66 的值。
    • “20141118133804”无效,因为它会根据您的格式“yyyyMMddhhmmss”,尝试将值“13”从小时匹配到 12 小时有效间隔。

    如果您从文件中加载此日期列表,请注意文件结尾处的空行。

    编辑: 在这种情况下,问题出在格式字符串上。 24 小时制应该是“yyyyMMddHHmmss”。

    【讨论】:

    • 值最初看起来像这样“20141118133804.000000-00”。我做了一个 $val.Split('.')[0] 因为所有值在点之后都有 000000-000 ,没有例外。这些值来自“Win32_TIssuedLicense”。
    • 只要在解析前输出输入值就可以快速找到错误值是什么
    • 谢谢,但我做到了。对不起,我只是把原来的功能放在这里。这就是现在的样子:我比较了它们,正则表达式只是为了确保字符串中只有数字,没有隐藏的“制表符”“换行符”等。这些值被导出到文件中并进行比较,但两者之间没有明显差异有效而无效的价值观。问候IG
    • 抱歉新行没有正确显示,所以我会用 #\n Function Convert-Date ([string]$parseDate)#\n {#\n #\n [regex]$r = "[^0-9$]"#\n [string]$parseDate = $r.Replace($parseDate,"")#\n $parseDate.GetType().FullName#\n try#\n {#\n #$convDate = #\n [DateTime]::ParseExact($parseDate.toString(),"yyyyMMddhhmmss", $null)#\n }#\n catch#\n {#\n Write-host "Error: $parseDate"#\n }#\n #\n #return $convDate#\n } 标记它们
    • 确实如此。我弄清楚了原因。您的格式有误。应该是“yyyyMMddHHmmss”,大写“HH”
    【解决方案2】:

    这是一种 Microsoft 日期时间格式,称为 CIM_DATETIME。您可以通过将[System.Management.ManagementDateTimeConverter]::ToDateTime() 与提供的字符串作为一个整体来获取有效的日期时间对象。请注意,如果您的字符串在.000000-000 部分中包含三个零以外的内容,则它是以分钟为单位的时区偏移量,例如"20141118133804.000000+180",并且需要考虑在内。所描述的方法考虑到了这一点。您使用 24 小时字符串格式的 `DateTime.ParseExact' 的解决方案是可以接受的,但没有考虑时区偏移。解析此格式的其他值时可能需要它。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多