当试图读取一个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()
现在的问题是,以结束位?
:-)
这是一个深思熟虑的决定。 当把一个字符串到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)中存在,可悲。 然而,很少有证据指向这是一个错误。