3.5中奇怪的DateTime.Parse异常?

时间:2010-10-02 05:24:07

标签: datetime .net-3.5 formatexception

这行代码适用于我的计算机(64位Win7)。我在VM中测试了XP 32位。它工作正常。

static bool HasExpire { get { return DateTime.Now >= DateTime.Parse("10/20/2010"); } }

但是在客户端计算机上会抛出此异常:

  

执行期间生成了未处理的异常   当前的网络请求。信息   关于的起源和位置   可以使用标识来识别异常   下面的异常堆栈跟踪。

[FormatException: String was not recognized as a valid DateTime.]
   System.DateTimeParse.Parse(String s,
       DateTimeFormatInfo dtfi,
       DateTimeStyles styles) +2838082

为什么不能在客户端计算机上解析客户端计算机上的日期?日期是硬编码的。我不明白这是怎么回事。我确认客户端有3.5,如果我改变该行总是返回false,那么应用程序运行完全正常,除非它无法判断试用期何时到期。

3 个答案:

答案 0 :(得分:5)

DateTime.Parse可能会意外地抛出FormatException,因为它与语言环境有关。从MSDN页面:

  

格式化受当前DateTimeFormatInfo对象的属性影响,默认情况下,该对象派生自“控制面板”中的“区域和语言选项”项。

您可能更愿意使用DateTime.ParseExact

答案 1 :(得分:1)

由于具有不同的区域,另一台计算机可能正在尝试将日期解析为dd / MM / yyyy。如果输入日期为“2010-10-20”

,您应该能够解析它

答案 2 :(得分:0)

AntiDogs指出问题的确切原因。但是使用ParseExact可以确保您知道确切的格式,并且客户端代码遵循这种格式。

在我们的系统中,由于bug要求实现的不同客户端在两种不同的文化中向我们的服务器组件发送DateTime值。我使用以下代码处理它:

private DateTime ParseWithDifferentCultures(string source)
{
    DateTime result;
    if (DateTime.TryParse(source, out result) 
        || DateTime.TryParse(source, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out result))
        return result;

    thrown new FormatException("Unrecognised DateTime format.");
}

在这里,首先我们尝试使用当前文化信息进行解析,然后使用不变的文化信息。当然,它并不理想,但它完全符合我们的需求。