powershell - 尝试使用 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”的异常:“字符串未被识别为有效的日期时间。”
任何帮助将不胜感激。
解决方案
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
推荐阅读
- javascript - 导入 ES6 模块需要 .js 扩展名?
- vue.js - 如何在本地服务器上部署 Vue CLI 应用程序?
- visual-studio - 如何在 Resharper 的 IntelliSense 中显示所有 Visual Studio 的代码片段?
- python - 散景没有图形呈现
- java - 模拟 RestTemplate getForObject
- r - dplyr:mutate_at + coalesce:列的动态名称
- javascript - 如何将值传递给 v-model?
- javascript - 在对象数组的数组中查找交点
- reactjs - React - 为什么 onClick 中的这个功能不起作用?
- c++ - C++ - 为什么这个带有函数指针参数的候选模板会被忽略?