我试图将类似'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”的异常:“未将字符串识别为有效的DateTime。”
任何帮助将不胜感激。
答案 0 :(得分:3)
postanote's answer包含有效的解决方案,但值得分析问题。
首先,只需将字符串强制转换为[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
(法国(法国))这样的文化中,上述情况会失败,在这种情况下,天是最先出现的。
在转换和cmdlet参数之间的数据类型转换行为中,这不幸的差异是in this GitHub issue记录的一个长期错误;出于向后兼容的原因,它不会得到解决。
关于您尝试过的事情:
Lee_Daily指出,您的问题是您的格式字符串'MM dd yyyy HH:mm:ss'
与输入的日期字符串"5/29/2019 8:46:47 PM"
不匹配:>
HH
以24小时格式表示一天中的小时,而您的输入使用12小时格式。
您输入的PM
没有用格式字符串表示;使用tt
来表示AM / PM说明符。
您正在使用空格分隔日期成分,而输入字符串使用/
您的格式字符串指定了一个双位月份组成部分(MM
;例如05
),而输入只有一位数字({{ 1}})。
因此,您应该使用以下内容:
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
,因为后者默认为 current 文化,这意味着在使用本地化AM /的文化中,呼叫可能会失败PM代号(例如,在越南文化($null
中,代号是vi-VN
/ SA
)。
当然,您也可以使用适当的特定区域性,例如CH
(英语(美国))(或假设您的代码永远不会与其他区域性活动一起运行)。
顺便说一句,请注意,格式字符串中的偶数en-US
和/
不是文字:它们代表了文化特定的日期和时间分隔符< / strong>。
要将它们视为文字,您必须使用嵌入式引号;例如,:
被引为/
,'/'
或'"/"
演示非文字解释:
\/
请注意PS> [datetime]::ParseExact('6.2019','M/yyyy', [cultureinfo] 'de-DE')
Saturday, June 1, 2019 12:00:00 AM
如何与适合文化的日期分隔符/
匹配。
在解析期间,总是在输出格式上使用适合文化的分隔符-出于礼貌-{{ 1}}和.
用作后备机制:
/
答案 1 :(得分:1)
尝试其中之一。
($stringToDatetime1 = '5/29/2019 8:46:47 PM' | Get-Date)
Wednesday, May 29, 2019 8:46:47 PM
($stringToDatetime2 = [DateTime]::ParseExact('5/29/2019 8:46:47 PM','M/d/yyyy h:mm:ss tt',$null))
Wednesday, May 29, 2019 8:46:47 PM
($stringToDatetime3 = [Datetime]'5/29/2019 8:46:47 PM')
Wednesday, May 29, 2019 8:46:47 PM
顺便说一句,此错误已在此处完整记录:
PowerShell [DateTime] throws the error “String was not recognized as a valid DateTime.”
答案 2 :(得分:0)
PS /Users/js> [DateTime]'5/29/2019 8:46:47 PM'
Wednesday, May 29, 2019 8:46:47 PM