.net - Get-Date 转换为字符串 vs ToString()

标签 .net powershell datetime

我对PowerShell字符串嵌入语法的理解"$($object)"一直是$object被转换为 [System.String] ,它调用 $object.ToString() .但是,我注意到 [DateTime] 的这种奇怪行为。在 Windows 8.1 上使用 PowerShell 4.0 类。

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) ?

最佳答案

如果一个对象实现了 IFormattable接口(interface),则 PowerShell 将调用 IFormattable.ToString而不是 Object.ToString用于类型转换操作。静态 Parse 也会发生类似的情况。方法:如果有 IFormatProvider 的重载参数,然后它将被调用。

Add-Type -TypeDefinition @'
    using System;
    using System.Globalization;
    public class MyClass:IFormattable {
        public static MyClass Parse(string str) {
            return new MyClass{String=str};
        }
        public static MyClass Parse(string str,IFormatProvider fp) {
            return new MyClass{String=str,FormatProvider=((CultureInfo)fp).DisplayName};
        }
        public string String {get;private set;}
        public string FormatProvider {get;private set;}
        public override string ToString() {
            return "Object.ToString()";
        }
        string IFormattable.ToString(string format,IFormatProvider fp) {
            return string.Format("IFormattable.ToString({0},{1})",format,((CultureInfo)fp).DisplayName);
        }
    }
'@
[String](New-Object MyClass) #Call IFormattable.ToString(null,CultureInfo.InvariantCulture)
[MyClass]'Test'              #Call MyClass.Parse("Test",CultureInfo.InvariantCulture)

关于.net - Get-Date 转换为字符串 vs ToString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538994/

相关文章:

Python - 如何考虑时间使用 toordinal 转换日期时间数据

php - 关于在 mysql 数据库中存储 PHP 支持的时区的最佳实践

c# - SSL 证书 : A specified logon session does not exist

C# WCF -- 通过自定义 AuthorizationManager 出现授权失败的自定义错误

.net - 需要 .Net SOLID 设计方面的帮助

python - Anaconda 提示 "Failed to create temp directory ' C :\temp\conda-<RANDOM>\' " error

c# - 只有第一次出现

powershell - 方法调用失败...不包含名为 'op_Addition' 的方法

.net - 在PowerShell中将日期时间格式化为\/Date(1411704000000)\/以JSON格式

javascript - 需要清楚 javascript 日期逻辑