首页 > 解决方案 > 尝试使用 ParseExact 将字符串转换为日期时间

问题描述

我正在尝试将这样的字符串转换'5/29/2019 8:46:47 PM'datetime用作 PowerShell 对象的字符串,但出现错误

我正在尝试使用该[datetime]::ParseExact方法

$Date = "5/29/2019 8:46:47 PM"

[datetime]::ParseExact($Date,'MM dd yyyy HH:mm:ss', $null)

我没有得到一个日期时间对象,而是得到这个错误:

使用“3”参数调用“ParseExact”的异常:“字符串未被识别为有效的日期时间。”

任何帮助将不胜感激。

标签: powershelldatetime

解决方案


postanote 的答案包含有效的解决方案,但值得分析问题。

首先,简单地将您的字符串转换[datetime]为就足够了,因为您的输入字符串是根据PowerShell 在这种情况下应用的不变文化规则直接识别的,而与当前文化无关(不变文化意味着是文化中立的,并且是基于美英文化):

PS> [datetime] "5/29/2019 8:46:47 PM"

Wednesday, May 29, 2019 8:46:47 PM

在幕后,PowerShell 将其转换为以下调用:

[datetime]::Parse("5/29/2019 8:46:47 PM", [cultureinfo]::InvariantCulture)

相比之下,对当前文化Get-Date 敏感:

# Works, but only in cultures that use AM / PM and place the month *first* in
# dates, notably, US-English.
PS> Get-Date -Date "5/29/2019 8:46:47 PM"

Wednesday, May 29, 2019 8:46:47 PM

上述方法在fr-FR(French (France)) 等文化中会失败,在这种文化中,这一天是第一位的。

强制转换和 cmdlet 参数之间的数据类型转换行为的这种不幸差异是这个 GitHub 问题中记录的长期错误;但是,出于向后兼容性的原因,它不会被修复。


至于你尝试了什么:

正如Lee_Daily指出的那样,您的问题是您的格式字符串'MM dd yyyy HH:mm:ss'与输入日期字符串不匹配"5/29/2019 8:46:47 PM"

  • HH以 24 小时格式表示一天中的小时,而您的输入使用 12 小时格式。

  • 您输入中的PM未在格式字符串中表示;用于tt一般表示 AM/PM 说明符。

  • 您使用空格分隔日期组件,而输入字符串使用/

  • 您的格式字符串指定了一个两位数的月份组件(MM; 例如,05),而输入只有一个数字(5)。

因此,您应该使用以下内容:

PS> [datetime]::ParseExact('5/29/2019 8:46:47 PM','M/d/yyyy h:mm:ss tt', [cultureinfo]::InvariantCulture)

Wednesday, May 29, 2019 8:46:47 PM

请注意使用[cultureinfo]::InvariantCulture代替$null,因为后者将默认为当前文化,这意味着在使用本地化 AM / PM 指示符的文化中调用可能会失败(例如,在越南文化 ( vi-VN) 中,指示符是SA/ CH)。

当然,您也可以使用适当的特定文化,例如en-US(英语(美国))(或假设您的代码永远不会在任何其他文化活动的情况下运行)。


顺便说一句,请注意even/:in 格式字符串不是文字:它们分别代表特定于文化的日期和时间分隔符

要将它们视为文字,您必须使用嵌入式引用;例如,/将被引用为'/''"/"\/

演示非字面解释:

PS> [datetime]::ParseExact('6.2019','M/yyyy', [cultureinfo] 'de-DE')

Saturday, June 1, 2019 12:00:00 AM

请注意/与文化相关的日期分隔符如何匹配,..

虽然文化适当的分隔符总是用于输出格式,但在解析过程中——出于礼貌——和的字面解释被用作后备机制:/:

# Works too - "/" is also recognized as a literal.
PS> [datetime]::ParseExact('6/2019','M/yyyy', [cultureinfo] 'de-DE')

Saturday, June 1, 2019 12:00:00 AM

推荐阅读