尝试将字符串数组转换为日期

Trying to convert array of strings to date

我 运行 遇到了一个奇怪的问题,我试图解析以下字符串的数组,这些字符串已被赋予变量 $DatesUnformatted:

2020-02-28T05:29:00Z
2020-02-28T04:52:00Z
2020-02-28T04:52:00Z
2020-02-27T17:01:00Z
2020-02-27T17:01:00Z
2020-02-27T17:01:00Z
2020-02-27T17:01:00Z

...使用 [DateTime]::ParseExact().

的时间格式 (hh:mm tt)

我的脚本看起来像这样:

foreach ($DateUnformatted in $DatesUnformatted)
{
    $DateFormatted = [datetime]::parseexact($DateUnformatted, 'yyyy-MM-ddThh:mm:ssZ',$null).ToString('hh:mm tt')
    echo "Converting $DateUnformatted to $DateFormatted"
}

这是输出:

Converting 2020-02-28T05:29:00Z to 12:29 AM
Converting 2020-02-28T04:52:00Z to 11:52 PM
Converting 2020-02-28T04:52:00Z to 11:52 PM
Converting 2020-02-27T17:01:00Z to 11:52 PM
Converting 2020-02-27T17:01:00Z to 11:52 PM
Converting 2020-02-27T17:01:00Z to 11:52 PM
Converting 2020-02-27T17:01:00Z to 11:52 PM

它似乎只转换前几个条目然后重复一个直到循环结束。有什么想法吗?

hh 仅适用于 12 小时时间格式(使用 AM/PM 指示符),而您的输入使用 24 小时 格式,您必须使用 HH:

[datetime]::ParseExact(
  $DateUnformatted, 
  'yyyy-MM-ddTHH:mm:ssZ', # note the 'HH'
  $null
).ToString('hh:mm tt')

您的症状表明 $ErrorActionPreference = 'SilentlyContinue' 已生效,否则您会看到 ParseExact() 方法大声触发其语句终止错误,并显示错误消息,例如:

Exception calling "ParseExact" with "3" argument(s): "String '2020-02-27T17:01:00Z' was not recognized as a valid DateTime."

无论如何,最后一次 成功的 调用的结果在变量 $DateFormatted.

中徘徊

您也可以像这样将字符串隐式转换为日期时间:

([datetime]'2020-02-28T04:52:00Z').ToString('hh:mm tt')

完整代码:

$DatesUnformatted | foreach { "Converting $_ to " + ([datetime]$_).ToString('hh:mm tt') }