我遇到了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
有人能指出我关于类型转换问题的正确文档吗?为什么在这种情况下它会使用不同的格式来回转换数据?
提前致谢。
答案 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文档进行一些搜索。
根据经验:如果不向最终用户显示字符串,请不要使用本地化的字符串。总是试着找到“不变的文化”。方法的变体,并用它来格式化和解析字符串。这将使您免于许多麻烦。