字符串到日期的相同解析模式一次工作,另一次失败?

时间:2014-08-01 10:42:48

标签: parsing datetime powershell

我下载了我的电子邮件,并想要对它们进行排序。到他们的约会。其中一些是转发的,因此电子邮件日期是转发日期,但不是原始日期。

以下是转发电子邮件的部分内容:

+ OK 5522 octetsReturn-Path:... id lg7sm19095682wjb.9.2014.08.01.01.02.00 ...
cipher = ECDHE-RSA-RC4-SHA位= 128/128); ...
星期五,01八月2014 01:02:00 -0700(PDT)消息ID:...
日期:星期五,2014年8月1日10:02:04 + 0200来自:...
内容类型:text / plain;字符集= UTF-8; format = flowedContent-Transfer-Encoding:8bit
-------- Original-Nachricht -------- ....
基准:星期二,2013年10月22日18:18:18 +0200(CEST)Von:......

如果我尝试捕捉原始电子邮件日期(日期:星期五,2014年8月1日10:02:04
这场比赛和解析完美无缺!!

            # **real send date** of email: Date: Fri, 01 Aug 2014 10:02:04 +0200
            if ( $mail -match 'Date:\W[a-zA-Z]+\W+(\d+.+?\d{4}\W[\d:]+)\W' ) { 
                $a=[datetime]::ParseExact($Matches[1], "dd MMM yyyy HH:mm:ss", $null)
                } else { $listOfMails.Add($a.ToString("yyyy.MM.dd-HH:mm:ss"),$mail); $n--; continue }
            } else { $n--; continue }

但是如果我尝试匹配并解析电子邮件的原始日期,那么这确实会失败吗?

            # the original date of the email:  Datum:   Tue, 22 Oct 2013 18:18:18...
            if ( $mail -match 'Original-Nachricht.+?Datum\W*[A-Z][a-zA-Z]+\W+(\d+.+?\d{4}\W[\d:]+)\W*' ) {
                Write-Host "Date 1: >$($Matches[1])<"
                try {
                    $a=[datetime]::ParseExact($Matches[1], "dd MMM yyyy HH:mm:ss", $null) 
                } catch { $_; break }
                $listOfMails.Add($a.ToString("yyyy.MM.dd-HH:mm:ss"),$mail); $n--; continue }
            }

1)那场比赛是正确的($ true)!
2)写主机打印:日期1:&gt; 2013年10月22日18:18:18&lt;
3)对我来说,要解析的正确模式是:&#39; dd MMM yyyy HH:mm:ss&#39;
4)但它失败了? 5)PowerShell的错误消息:
例外..&#34;该字符串未被重新确认为有效的DateTime&#34; (我的德语翻译)
Bei C:\ Users \ cas \ Documents \ sysTools \ PC \ WindowsPowerShell \ Pop3_v2.ps1:168 Zeichen:50
+ $ a = [datetime] :: ParseExact&lt;&lt;&lt;&lt; ($匹配[1],&#34; dd MMM yyyy HH:mm:ss&#34;,$ null)
    + CategoryInfo:NotSpecified:(:) [],MethodInvocationException
    + FullyQualifiedErrorId:DotNetMethodException

知道导致问题的原因和做法是什么? 感谢

PS只是让我添加这条消息,直接从邮箱中删除然后解析..

在我的德国电脑上找到了解决方案。 10月导致问题 - Okt解决了它。

1 个答案:

答案 0 :(得分:2)

问题在于文化。从MSDN,当您调用DateTime.ParseExact:

  

如果provider为null,则使用与当前区域性对应的CultureInfo对象。

我假设您的解析失败,因为您使用的是德语CultureInfo de-DE。相同的解析适用于en-USInvariantCulture

PS C:\> $s = "22 Oct 2013 18:18:18"
PS C:\> $f = "dd MMM yyyy HH:mm:ss"
PS C:\> [datetime]::ParseExact($s, $f, [CultureInfo]::GetCultureInfo("de-DE"))
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
At line:1 char:1
+ [datetime]::ParseExact("22 Oct 2013 18:18:18", "dd MMM yyyy HH:mm:ss", [CultureI ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException

PS C:\> [datetime]::ParseExact($s, $f, [CultureInfo]::GetCultureInfo("en-US"))

Tuesday, October 22, 2013 18:18:18

PS C:\> [datetime]::ParseExact($s, $f, [CultureInfo]::InvariantCulture)

Tuesday, October 22, 2013 18:18:18

我不懂德语,所以我继续谷歌翻译,发现德语中的“十月”拼写为“Oktober”。现在,以下代码有效:

PS C:\> [datetime]::ParseExact("22 Okt 2013 18:18:18", $f, [CultureInfo]::GetCultureInfo("de-DE"))

Tuesday, October 22, 2013 18:18:18