我在数组变量
中有以下内容Mon May 1 08:13:18 2017 Sat Apr 29 19:07:14 2017
为了更新格式和时区,我必须先运行这两个ParseExact
命令。
$time | ForEach-Object {$_ = [datetime]::ParseExact($_,'ddd MMM d HH:mm:ss yyyy',[System.Globalization.CultureInfo]::InvariantCulture)}
$time | ForEach-Object {$_ = [datetime]::ParseExact($_,'ddd MMM dd HH:mm:ss yyyy',[System.Globalization.CultureInfo]::InvariantCulture)}
我收到错误的错误(预期)
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime." At D:\UPDATING.ps1: + ... ach-Object {$_ = [datetime]::ParseExact($_ ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FormatException
从长远来看,一切都有效,我可以进行格式化,但我想知道是否有更好的做法,而不是使用2 parseExact
s
答案 0 :(得分:2)
您的第一个日期和单个数字日有一个额外的空间,因此模式实际上需要ddd MMM d HH:mm:ss yyyy
。
完整命令:
[datetime]::ParseExact($_,'ddd MMM d HH:mm:ss yyyy',[System.Globalization.CultureInfo]::InvariantCulture)
但是,第二次约会并非如此。单个d
仍然适用于此,但空间的变化是您可能需要编程的问题。一种解决方案是首先用单打替换所有双空格。
这似乎适用于这两个日期,这是一个概念证明:
$dates = "Sat Apr 29 19:07:14 2017","Mon May 1 08:13:18 2017"
$dates = $dates -replace ' ',' '
$dates | ForEach-Object {
[datetime]::ParseExact($_,'ddd MMM d HH:mm:ss yyyy',[System.Globalization.CultureInfo]::InvariantCulture)
}
答案 1 :(得分:1)
ParseExact
方法存在多个重载。其中一个允许您指定要解析的多种日期模式:
$time = 'Sat Apr 29 19:07:14 2017', 'Mon May 1 08:13:18 2017'
$time | % { [DateTime]::ParseExact($_, [String[]]('ddd MMM d HH:mm:ss yyyy',
'ddd MMM dd HH:mm:ss yyyy'), [CultureInfo]::InvariantCulture, 'None') }
还有重载,允许您指定其他解析选项,如[Globalization.DateTimeStyles]::AllowInnerWhite
,以允许在解析后的字符串中添加其他空格字符:
$time | % { [DateTime]::ParseExact($_, 'ddd MMM d HH:mm:ss yyyy', [CultureInfo]::InvariantCulture, 'AllowInnerWhite') }