为什么总是PowerShell的铸造为DateTime时使用的美国文化?(Why does Powe

2019-07-18 06:43发布

当试图读取一个CSV昨天,我注意到PowerShell中似乎总是假定美国日期格式当使用[datetime]"date"

我的区域设置是正确的 ,并且[DateTime]::Parse("date")使用英国日期格式 (DD / MM / YYYY)。

这是一个错误,或者是故意的决定吗? 如果一个深思熟虑的决定,这是记录任何地方?

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

(注:美国的机器上,我希望这些对象将是相同的,但不能因此这里在我的机器在英国)。

注:我不想更改格式(这是从外部源的文件),我不想在输出格式化日期,我知道我可以使用[DateTime]::Parse() 现在的问题是,以结束位? :-)

Answer 1:

这是一个深思熟虑的决定。 当把一个字符串到DateTime ,你可以使用的新空房禁地美国格式 ISO 8601 - [datetime]'2012-10-12'工作得很好,是好得多阅读。

究其原因,这是有限的,限制的是脚本,不应该对当前文化的依赖,至少在文字和准文字(如铸造字符串)。 这是在编写健壮批处理文件的一大问题,你当然不希望在PowerShell中的同样的问题。

李福尔摩斯有一个解释 ,这可以被认为是半官方的,因为他是/是在PowerShell团队在MS:

为了防止弹出到你的脚本微妙的国际化问题,PowerShell将[DateTime] '11/26/2007' (日期不变),如语言功能-只是因为它[Double] 10.5 (数值不变)并非所有的文化使用小数点馏分分离器,但编程语言就可以了标准化。 并非所有文化使用的en-US DateTime格式,导致数以百万计的国际化错误的,当人们不考虑其在这些文化的软件运行的影响。

什么李忘记提及是我以前写的,那更合理的ISO 8601格式的作品,以及。

这个文档没有任何PowerShell的文档或语言规范(V2)中存在,可悲。 然而,很少有证据指向这是一个错误。



文章来源: Why does PowerShell always use US culture when casting to DateTime?