16

昨天尝试读取 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(). 问题是以?:-)结尾的那一点

4

2 回答 2

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-USDateTime格式,当人们不考虑在这些文化中运行他们的软件的影响时,会导致数百万国际化错误。

Lee 忘记提及的是我之前写的,更合理的 ISO 8601 格式也可以工作。

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

于 2013-01-16T13:00:10.353 回答
0

如果需要,您可以强制为单个命令设置区域性:

PS C:\> [System.Threading.Thread]::CurrentThread.CurrentUICulture = "en-US" ; [System.Threading.Thread]::CurrentThread.CurrentCulture = "en-US"; [DateTime]::Parse("12/10/2012")

Monday, December 10, 2012 12:00:00 AM

PS C:\> [System.Threading.Thread]::CurrentThread.CurrentUICulture = "en-GB" ; [System.Threading.Thread]::CurrentThread.CurrentCulture = "en-GB"; [DateTime]::Parse("12/10/2012")

12 October 2012 00:00:00
于 2020-08-26T22:17:52.520 回答