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

时间:2017-01-17 19:11:13

标签: powershell datetime powershell-v5.0

我遇到了2行代码的问题,这些代码不能像我预期的那样工作。关键是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

有人能指出我关于类型转换问题的正确文档吗?为什么在这种情况下它会使用不同的格式来回转换数据?

提前致谢。

2 个答案:

答案 0 :(得分:2)

您隐式调用Convert.ToDateTime(String),但此方法的有效格式是硬编码的(并且似乎未列出)。根据您的输出日期格式,我发现您可能不在美国,这可能是大多数格式所针对的。

相反,您可以明确使用Convert.ToDateTime(String, IFormatProvider)告诉它您想要哪种文化格式提供程序。

[Convert]::ToDateTime($timeString, [System.Globalization.DateTimeFormatInfo]::CurrentInfo)

我在美国系统上,所以我不确定这是否可行。

您还可以使用[DateTime]::TryParse()[DateTime]::TryParseExact()明确指定所需的格式。

答案 1 :(得分:2)

解析日期总是一场噩梦。特别是如果你生活在世界上被称为“美国以外”的小部分地区。 :)

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

  

如果value不为null,则返回值是调用的结果   使用a中的格式信息对值的DateTime.Parse方法   为当前文化初始化的DateTimeFormatInfo对象。   value参数必须包含日期和时间的表示   以DateTimeFormatInfo主题中描述的格式之一。

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

根据经验:如果不向最终用户显示字符串,请不要使用本地化的字符串。总是试着找到“不变的文化”。方法的变体,并用它来格式化和解析字符串。这将使您免于许多麻烦。