我下载了我的电子邮件,想把它们排序。敬他们的约会对象。其中一些邮件被转发,因此邮件日期是转发日期,而不是原始日期。
所以这里是部分转发的电子邮件:
+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-US
或InvariantCulture
。
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