【发布时间】:2015-05-29 21:01:36
【问题描述】:
我对PowerShell的字符串嵌入语法"$($object)"的理解一直是$object被转换为[System.String],它调用$object.ToString()。但是,我注意到在 Windows 8.1 上使用 PowerShell 4.0 的 [DateTime] 类的这种奇怪行为。
PS> $x = Get-Date
PS> $x.GetType() | select -ExpandProperty Name
DateTime
PS> $x.ToString()
2015-05-29 13:36:06
PS> [String]$x
05/29/2015 13:36:06
PS> "$($x)"
05/29/2015 13:36:06
似乎"$($object)" 给出了与转换为字符串相同的行为,但显然产生了与$object.ToString() 不同的结果。 $x.ToString() 与 intl.cpl (yyyy-MM-dd) 中设置的短日期格式一致。 [String]$x 似乎使用 en-US 默认值。
这可能只是 DateTime 类中的一个错误,但我更惊讶的是,将对象转换为字符串的不同方法会产生不同的结果。如果不调用ToString(),将对象转换为字符串的规则是什么? DateTime 类是否只是一个特例,因为它重载了ToString(String)?
【问题讨论】:
-
我现在没有足够的答案,但我确实注意到
.ToString()并不总是产生与将对象嵌入字符串相同的结果(我没有测试是否嵌入总是与转换为[String]相同。所以我只能说不限于[DateTime]。 -
.Tostring()接受格式参数,因此如果您需要一致性,请始终使用.ToString()并提供您想要的格式。同时,同意cast应该只调用.ToString()并接受它的默认格式。不知道他们为什么会以其他方式实现它。 -
Probably related。我怀疑无论哪种方式,铸造都使用 en-US 作为默认文化。
ToString()OTOH 使用当前文化,如 documented。 -
你机器上
Get-Culture的输出是什么? -
嗯.. 我得到
mm/dd/yyyy格式和$x.ToString()。虽然我也有 12 小时的时间,而[String]$x我有 24 小时的时间。另外值得注意的是 - 从DateTime到[String]的转换必须是 Powershell 支持的,因为它对 C# 或其他 .NET 语言无效。
标签: .net powershell datetime