转换为 Datetime 对象时出现问题

Mat*_*tyS 2 powershell datetime

我有以下数据,它是一个名为 $timestamps 的对象类型变量

Sat Jan 15 16:21:24
Sat Jan 15 01:31:22
Fri Jan 14 20:58:09
Fri Jan 14 20:51:02
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

由于奇怪的日期格式,我在将其转换为 Datetime 对象时遇到问题。你会怎么处理这个?

我希望它作为日期时间对象,因为我计划从当前 (UTC) 转换为 EST。

TIA

Abr*_*ala 6

您可以使用ParseExact()该类提供的方法来执行[datetime]此操作:

[datetime]::ParseExact('Fri Jan 14 20:58:09','ddd MMM dd HH:mm:ss',$null)

# returns a - datetime - object of:
# Friday, January 14, 2022 8:58:09 PM
Run Code Online (Sandbox Code Playgroud)
  • dd - 当天。
  • MM - 这个月。
  • HH - 小时 - 大写,表示 24 小时时间格式。
  • mm - 分钟。
  • ss - 秒。

编辑:根据mklement0的建议,我们可以使用特定于英语[cultureinfo]::InvariantCulture日期时间格式的解析。此外,将dd更改为d作为更强大的解决方案,适用于没有 2 位数字的日子;其中应涵盖单数和两位数天数。

看到$timestamps是一个字符串数组,您可以使用循环(您选择的 - 在本例中为cmdlet )来迭代每个字符串解析文本以返回一个对象:Foreach-Objectdatetime

$timestamps | ForEach-Object {
    $culture = [cultureinfo]::InvariantCulture
    $format  = 'ddd MMM d HH:mm:ss'
    $date = [datetime]::ParseExact($_,$format,$culture,'AssumeUniversal, AdjustToUniversal')
    [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($date, 'Eastern Standard Time')
}
Run Code Online (Sandbox Code Playgroud)
  • 使用'AssumeUniversal, AdjustToUniversal'可确保 UTC 输出。

假设根据您的评论,您想要转换为东部时间,将新创建的日期时间对象传递给[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId()所需时区的参数,您可以在新时区中获得结果。


使用 时$null,将使用与当前区域性相对应的CultureInfo对象。

  • @MattyS:`$timestamps =“1月15日星期六16:21:24”,“1月15日星期六01:31:22”,“1月14日星期五20:58:09”,“1月14日星期五20:51:02” ; $timestamps.ForEach({ [datetime]::ParseExact($_, 'ddd MMM d HH:mm:ss', [cultureinfo]::InvariantCulture, '假设通用,调整通用') })` (2认同)
  • @lit,“$null”是_current_文化的占位符(“$PSCulture”==“[cultureinfo]::CurrentCulture”)。[不变文化](https://learn.microsoft.com/en-US/dotnet/api/System.Globalization.CultureInfo.InvariantCulture) 基于(美国)英语,但与它不同(与任何英语不同)现实世界文化,包括“[cultureinfo] 'en-US'”);值得注意的是,它的格式保证永远不会改变。 (2认同)
  • 不客气,@Abraham;感谢您更新。看起来不错; 我唯一要补充的是:“AssumeUniversal”将_input_解释为UTC - 其本身将被转换为_local_时间;添加 `AdjustToUniversal` 会输出 UTC 实例。 (2认同)