为什么PowerShell将DateTime格式字符串中的斜杠视为点?

时间:2016-11-12 19:00:10

标签: powershell

PS C:\> (Get-Date).ToString("MM/dd/yyyy")
11.12.2016

PS C:\> [DateTime]::ParseExact('10/14/2016', 'MM/dd/yyyy', $null)
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."At line:1 char:1
+ [DateTime]::ParseExact('10/14/2016', 'MM/dd/yyyy', $null)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : FormatException


PS C:\> [DateTime]::ParseExact('10.14.2016', 'MM/dd/yyyy', $null)

14 Oct 2016 0:00:00



PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117   

它位于Windows Server 2008 R2上。 在Windows 10上,版本是5.1.14393.206,它可以正常工作。

发生了什么事?

4 个答案:

答案 0 :(得分:1)

正如Jeroen Mostert在您的问题的评论中指出的那样,正斜杠在日期/时间格式字符串中具有特殊含义。

来自documentation

  

" /"自定义格式说明符

     

" /"自定义格式说明符表示日期分隔符,用于区分年,月和日。从当前或指定文化的DateTimeFormatInfo.DateSeparator属性中检索适当的本地化日期分隔符。

     
    

注意
    要更改特定日期和时间字符串的日期分隔符,请在文字字符串分隔符中指定分隔符。例如,自定义格式字符串mm'/'dd'/'yyyy生成一个结果字符串,其中" /"始终用作日期分隔符。要更改区域性的所有日期的日期分隔符,请更改当前区域性的DateTimeFormatInfo.DateSeparator属性的值,或实例化DateTimeFormatInfo对象,将字符分配给其DateSeparator属性,并调用包含IFormatProvider参数的格式化方法的重载。

  

要匹配文字正斜杠而不是系统区域设置中定义的日期分隔符,请使用反斜杠('MM\/dd\/yyyy')对其进行转义。

此外,不建议为格式提供程序传递$null。为日期字符串指定正确的culture,或者如果您希望解析的字符串独立于特定的文化,请使用InvariantCulture

[DateTime]::ParseExact('10/14/2016', 'MM\/dd\/yyyy', [Globalization.CultureInfo]::InvariantCulture)

答案 1 :(得分:1)

如果您要处理非本地化值,请使用InvariantCulture

PS C:\> ([Globalization.CultureInfo]::InvariantCulture).DateTimeFormat.DateSeparator
/

在我的系统上,我有为ISO-8601设置的日期格式。这会导致我的分隔符为连字符-

PS C:\> (Get-Culture).DateTimeFormat.DateSeparator
-

有趣的转换。

PS C:\> (Get-Date).ToString("MM/dd/yyyy")
11-12-2016

答案 2 :(得分:0)

你可以用这个:

get-date -format "yyyy/MM/dd"

答案 3 :(得分:0)

长格式:

Get-Date -Format "yyyy\/MM\/dd"

速记:

date -f "yyyy\/MM\/dd"

请注意,是的,在这种情况下,您将反斜杠用作转义字符,而不是波浪号。