Powershell v5中的字符串到日期时间转换错误

Powershell v5中的字符串到日期时间转换错误,powershell,datetime,powershell-5.0,Powershell,Datetime,Powershell 5.0,我有一个问题,有两行代码,这不是我所期望的工作。关键是,DateTime对象正在使用默认转换转换为string并返回到DateTime,而没有明确的格式规范 $timeString = [DateTime]::Now.ToString() # contains 17.01.2017 20:01:30 $time = [DateTime]$timeString # PS blows with error 因此,基本上,它使用默认的日期格式来格式化字符串,但随后它似乎使用其他格式来解析它。但是,以

我有一个问题,有两行代码,这不是我所期望的工作。关键是,
DateTime
对象正在使用默认转换转换为
string
并返回到DateTime,而没有明确的格式规范

$timeString = [DateTime]::Now.ToString() # contains 17.01.2017 20:01:30
$time = [DateTime]$timeString # PS blows with error
因此,基本上,它使用默认的日期格式来格式化字符串,但随后它似乎使用其他格式来解析它。但是,以下代码行将起作用:

$otherTime = [DateTime]"01/17/2017 20:01:30" # will get the initial date
有人能告诉我关于类型转换的适当文档吗?为什么在这种情况下,它会使用不同的格式来来回转换数据

提前感谢。

您正在隐式调用,但此方法的有效格式是硬编码的(并且似乎没有列出)。从您的输出日期格式中,我发现您可能不在美国,这可能是大多数格式的中心

相反,您可以显式使用来告诉它您想要哪个区域性格式提供程序

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo)
我使用的是美国的系统,所以我还不能完全确定这是否有效

您还可以使用或显式指定所需的格式。

您正在隐式调用,但此方法的有效格式是硬编码的(并且似乎未列出)。从您的输出日期格式中,我发现您可能不在美国,这可能是大多数格式的中心

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo)
相反,您可以显式使用来告诉它您想要哪个区域性格式提供程序

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo)
我使用的是美国的系统,所以我还不能完全确定这是否有效


您还可以使用或显式指定所需的格式。

解析日期总是一场噩梦。特别是如果你生活在世界上被称为“我们之外”的一小部分:

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo)
通常,.NET中的格式化和解析日期(以及字符串比较等许多其他内容)由区域性设置控制。在某些情况下,默认行为是使用当前区域性设置<代码>转换。ToDateTime就是其中之一。如果您查看文档(),它会说:

如果值不为null,则返回值是调用 使用 为当前区域性初始化的DateTimeFormatInfo对象。 value参数必须包含日期和时间的表示形式 使用DateTimeFormatInfo主题中描述的格式之一

这就是它从本地化日期字符串转换的原因。在其他情况下,默认行为是使用“不变文化”设置,这通常意味着“美国设置”。大多数方法都是重载的,可以使用一个参数来指定应该使用的区域性,但它需要对.NET文档进行少量搜索


经验法则是:如果不向最终用户显示本地化字符串,则不要使用这些字符串。始终尝试查找方法的“不变区域性”变体,并将其用于格式化和解析字符串。解析日期总是一场噩梦。特别是如果你生活在世界上被称为“我们之外”的一小部分:

通常,.NET中的格式化和解析日期(以及字符串比较等许多其他内容)由区域性设置控制。在某些情况下,默认行为是使用当前区域性设置<代码>转换。ToDateTime就是其中之一。如果您查看文档(),它会说:

如果值不为null,则返回值是调用 使用 为当前区域性初始化的DateTimeFormatInfo对象。 value参数必须包含日期和时间的表示形式 使用DateTimeFormatInfo主题中描述的格式之一

这就是它从本地化日期字符串转换的原因。在其他情况下,默认行为是使用“不变文化”设置,这通常意味着“美国设置”。大多数方法都是重载的,可以使用一个参数来指定应该使用的区域性,但它需要对.NET文档进行少量搜索


经验法则是:如果不向最终用户显示本地化字符串,则不要使用这些字符串。始终尝试查找方法的“不变区域性”变体,并将其用于格式化和解析字符串。这将使您免于许多麻烦。

我无法复制您的问题。第一个脚本块工作正常。使用
[string][DateTime]::Now
[DateTime]::Now.ToString([CultureInfo]::InvariantCulture)
。我无法复制您的问题。第一个脚本块工作正常。使用
[string][DateTime]::Now
[DateTime]::Now.ToString([CultureInfo]::InvariantCulture)
。是的,我使用不同的区域性,其中格式为
dd.MM.yyyy
,分隔符为
dot
。我做了更多的调查,碰巧
[System.Convert]::ToDateTime(“01/18/2017”)
抛出异常,而
[System.Convert]::ToDateTime(“18.01.2017”)
返回1月18日的有效日期。所以,它看起来不像调用
Convert.ToDateTime
方法,至少在没有参数的情况下是这样。也许它传递了不变的文化,谁知道呢。基本上,我的问题不是关于变通方法,而是关于为什么它会以这种方式工作的技术解释。也许我们需要在某个地方提交一个bug:)是的,我使用不同的区域性,格式是
dd.MM.yyyy
,分隔符是
dot
。我做了更多的调查,碰巧
[System.Convert]::ToDateTime(“01/18/2017”)
抛出异常,而
[System.Convert]::ToDateTime(“18.01.2017”)
返回1月18日的有效日期。所以,它看起来不像调用
Convert.ToDateTime
方法,至少在没有参数的情况下是这样。也许是吧