【问题标题】:String was not recognized as a valid DateTime. using ParseExact on Windows Server 2012字符串未被识别为有效的日期时间。在 Windows Server 2012 上使用 ParseExact
【发布时间】:2014-07-22 12:32:17
【问题描述】:

我正在尝试使用“en-CA”文化信息将字符串解析为日期。 它在 Windows Server 2008 R2 上运行良好,但在 Windows Server 2012 中显示异常:- 字符串未被识别为有效的 DateTime。

下面是代码段:-

 DateTime tvDefaultDate = DateTime.ParseExact("31/12/9999", "dd/MM/yyyy", 
                                                      new CultureInfo("en-CA"));

【问题讨论】:

  • 您的代码适用于 .NET 4.5 版本。您在 Windows Server 2012 机器上使用的是哪个 .net 框架版本?

标签: c#


【解决方案1】:

/这里简单表示“日期分隔符”(DateTimeFormatInfo.DateSeparator),与数字相同,表示“千位分隔符”(不是逗号),.表示“小数分隔符”(不是期间)。

在en-CA中,分隔符映射为-;日期需要为31-12-9999。要使用文字 / 而不是日期分隔符,您需要对其进行转义:

DateTime tvDefaultDate = DateTime.ParseExact("31/12/9999", @"dd\/MM\/yyyy",
        new CultureInfo("en-CA"));

或者,改用不变的文化;不变区域性使用/ 作为日期分隔符。

【讨论】:

  • user1315023 写道,他的代码在 windows server 2008R2 中运行良好,但在 windows server 2012 中出现问题,您也能给出原因吗?
  • @Jageen 大概是操作系统版本之间的 en-CA 文化信息配置略有不同;我猜它在服务器 2008R2 中根本不正确,并且已在 2012 年更新。我也不排除旧服务器上的注册表调整(你可以,IIRC,通过注册表调整文化)
  • 感谢@MarcGravell,即使提供了文化信息,您建议的更改也能正常工作...
  • 您在此代码 Marc 上使用了哪个 .NET Framework 版本?因为在 4.5 框架中,(new CultureInfo("en-CA")).DateTimeFormat.DateSeparator 返回 / 而不是 -。在ideone 中。
【解决方案2】:

IFormatProvider中不需要文化,直接传null即可。

DateTime tvDefaultDate = DateTime.ParseExact("31/12/9999", "dd/MM/yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(tvDefaultDate);

输出:

12/31/9999 12:00:00 AM

(很抱歉最后日期的美国格式。)

【讨论】:

  • 但是如果他想指定一种文化怎么办?显然,他确实想要那个。
  • AI 同意 usr。我不相信IFormatProvider 是不需要的。
  • 提供的文化信息不起作用的原因是因为CultureInfo("en-CA").DateTimeFormat.DateSeparator-,而不是/,所以如果用户想使用提供的格式,他们必须转义@ 987654329@ 或使用-。因此,对于指定的用例,null 是一个可行的解决方案。
  • @PeteGarafano null 是几个可行的解决方案之一;其中哪一个是正确的,很大程度上取决于意图;坦率地说,我宁愿看到CultureInfo.InvariantCulture 而不是null
  • @MarcGravell 每个问题都有很多解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多