为什么PowerShell在转换为DateTime时总是使用美国文化?

Dan*_*eny 15 powershell localization date date-format powershell-3.0

昨天尝试读取CSV时,我注意到PowerShell在使用时似乎总是采用美国日期格式[datetime]"date".

我的区域设置都是正确的,并[DateTime]::Parse("date")使用英国日期格式(年/月/ ).

这是一个错误,还是一个刻意的决定?如果是故意的决定,是否记录在任何地方?

PS D:\> [DateTime]"12/10/2012"
10 December 2012 00:00:00

PS D:\> [DateTime]::Parse("12/10/2012")
12 October 2012 00:00:00
Run Code Online (Sandbox Code Playgroud)

(注意:在美国的机器上,我希望这些物体是相同的,但在英国的机器上却不是这样).

注意:我不想更改格式(它是来自外部源的文件),我不想在输出中格式化日期,我知道我可以使用[DateTime]::Parse().问题是结尾的一点?:-)

Joe*_*oey 16

这是一个深思熟虑的决定.将字符串转换为a时,DateTime您可以使用braindead US格式 ISO 8601 - [datetime]'2012-10-12'工作得很好并且阅读起来更好.

限制和限制的原因是脚本不应该依赖于当前的文化,至少对于文字和准文字(如类似的字符串).这是编写健壮的批处理文件的主要问题,您当然不希望在PowerShell中出现相同的问题.

Lee Holmes有一个解释,可以被认为是半官方的,因为他/他在MS的PowerShell团队中:

为了防止微妙的国际化问题弹出到您的脚本中,PowerShell将[DateTime] '11/26/2007'(日期常量)视为语言功能 - 就像它一样[Double] 10.5(数字常量).并非所有文化都使用小数点作为分数分隔符,但编程语言标准化它.并非所有文化都使用en-US DateTime格式,当人们不考虑在这些文化中运行软件的影响时,会导致数百万的国际化错误.

李忘记提到的是我之前写过的,更合理的ISO 8601格式也适用.

遗憾的是,PowerShell文档或语言规范(v2)中都没有这方面的文档.但是,很少有证据表明这是一个错误.