String to Date的相同解析模式工作一次,另一次失败



我下载了我的电子邮件,想把它们排序。敬他们的约会对象。其中一些邮件被转发,因此邮件日期是转发日期,而不是原始日期。

所以这里是部分转发的电子邮件:

+OK 5522 octetsReturn-Path:…Id lg7sm19095682wjob .9.2014.08.01.01.02.00…
密码= ECDHE-RSA-RC4-SHA比特= 128/128);
…2014年8月1日星期五01:02:00 -0700 (PDT)Message-ID:…
日期:Fri, 01 Aug 2014 10:02:04 +0200From:…
内容类型:文本/平原;charset = utf - 8;格式= flowedContent-Transfer-Encoding: 8位
-------- original - nachright -------- ....
基准点:星期二,2013年10月22日18:18:18 +0200 (CEST)Von:…

如果我试图捕捉原始的电子邮件日期(日期:Fri, 01 Aug 2014 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.+?DatumW*[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:> 2013年10月22日18:18:18<<br>3)对我来说,正确的解析模式应该是:'dd MMM yyyy HH:mm:ss'
4)但失败了?
5) PowerShell的Error-message:
异常. ."字符串未被识别为有效的日期时间"(我从德语翻译)
贝C:UserscasDocumentssysToolsPC WindowsPowerShell Pop3_v2。ps1:168 Zeichen: 50
+ $a=[datetime]::ParseExact <<<($Matches[1], "dd MMM yyyy HH:mm:ss", $null)
+ CategoryInfo: NotSpecified: (:) [], MethodInvocationException
+ fulllyqualifiederrid: DotNetMethodException

你知道是什么导致了这个问题,该怎么做吗?
由于

PS,让我补充一下,这条消息是直接从邮箱发送过来的,然后被解析了。

在我的德国PC上找到了解决方案。

问题出在文化上。来自MSDN,当你调用DateTime。ParseExact:

如果provider为空,则使用与当前区域性相对应的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

最新更新