将字符串转换为具有可变数字的日期时间对象

时间:2017-05-01 11:05:19

标签: powershell date datetime

我在数组变量

中有以下内容
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

2 个答案:

答案 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') }