Powershell 将字符串转换为 mmddyyyy 格式的最简洁方法

Powershell Cleanest way to convert a string to mmddyyyy format

提前谢谢你...

我有字符串输出:

2021-12-23

字符串 Base.Type 是 System.Object

我想将其转换为:

12-23-2021  

12/23/2021

有什么想法吗?

注意:这个问题几乎与重复;虽然这两者密切相关,但这个问题更明显地集中在 both 解析 from 一个字符串到一个日期然后返回 to 一个字符串,使用不同的格式;相比之下,链接问题的 from 方面作为问题的附带部分涵盖。


Bali C,在对问题的评论中,提出了最简洁的解决方案,只需要一个小的调整:

# Note the "\"-escaped separators - see below.
PS> Get-Date -Date 2021-12-23 -Format dd\-MM\-yyyy # or dd\/MM\/yyyy
23-12-2021

这将适用于 大多数 有效的文化,因为格式 yyyy-MM-dd(如您的示例输入字符串 '2021-12-23' 所示)是一种可识别的格式在除少数文化之外的所有文化中。

PowerShell 通常 尝试使用 invariant culture in order for code to work the same across cultures, but in the case of cmdlet arguments actually is culture-sensitive, which is a historical accident that cannot be fixed without breaking backward compatibility.

请参阅下面的真正文化不变的解决方案,这也解释了分隔符的原因。 -/ 应该 转义 以获得最大的稳健性。


由于 PowerShell 的转换使用 invariant culture 格式 yyyy-MM-dd(如示例输入字符串所示) , '2021-12-23') 恰好是 该文化中的公认格式,您可以简单地:

  • 将您的字符串转换为 [datetime] 以创建一个 System.DateTime 实例
  • 然后用所需的格式字符串 调用 .ToString() 以生成所需的字符串格式,如 this question 的许多答案所示。

无论实际的特定文化如何,以下内容都应该有效:

PS> ([datetime] '2021-12-23').ToString('MM\-dd\-yyyy')
12-23-2021

PS> ([datetime] '2021-12-23').ToString('MM"/"dd"/"yyyy')
12/23/2021

请注意分隔符字符。 -/ 转义 / 引用 以表明它们将被使用 verbatim(您可以在 \-转义和嵌入引用之间自由选择)。

这是必要的,因为像 / 这样的字符在默认情况下被解释为 placeholders culture-appropriate date分隔符,例如,因此 - 取决于有效的文化(如 $PSCulture 中所反映) - 它们可能会被翻译成 不同的 字符,例如 . , 例如.


如果您的原始字符串表示在不变区域性中被识别,您可以使用System.DateTime.ParseExact来解析您的输入在调用 .ToString() 之前将字符串转换为 [datetime] (System.DateTime) 实例:

[datetime]::ParseExact(
  '2021-12-23', 
  'yyyy\-MM\-dd', 
  $null  # current culture
).ToString('MM"-"dd"-"yyyy')

以上再次产生 '12-23-2021'

请注意,由于使用 $nullcurrent 区域性用于解析,这在这种情况下无效,但是,考虑到分隔符字符。使用嵌入式引号,并且假设只涉及 数字 ,而不涉及(文化相关的) 名称 ,例如月份名称。

如果您确实需要特定文化的上下文,请传递一个[cultureinfo]实例(System.Globalization.CultureInfo ) 而不是 $null;例如,要在法语(法国)文化的上下文中进行解析,请传递 [cultureinfo] 'fr-FR'.