奇怪的DateTime.在3.5中解析异常?

奇怪的DateTime.在3.5中解析异常?,datetime,.net-3.5,formatexception,Datetime,.net 3.5,Formatexception,这行代码适用于我的计算机(64位Win7)。我在虚拟机中测试了32位XP。它很好用 static bool HasExpire { get { return DateTime.Now >= DateTime.Parse("10/20/2010"); } } 但是,在客户端计算机上,它会引发以下异常: 在执行过程中生成了未处理的异常 当前web请求。问询处 关于 可以使用 下面是异常堆栈跟踪 [FormatException: String was not recognized as a

这行代码适用于我的计算机(64位Win7)。我在虚拟机中测试了32位XP。它很好用

static bool HasExpire { get { return DateTime.Now >= DateTime.Parse("10/20/2010"); } }
但是,在客户端计算机上,它会引发以下异常:

在执行过程中生成了未处理的异常 当前web请求。问询处 关于 可以使用 下面是异常堆栈跟踪

[FormatException: String was not recognized as a valid DateTime.]
   System.DateTimeParse.Parse(String s,
       DateTimeFormatInfo dtfi,
       DateTimeStyles styles) +2838082
当它在我的虚拟机上解析日期时,为什么它不能解析客户机上的日期?日期是硬编码的。我不明白这怎么会发生。我确认客户端有3.5版本,如果我将该行更改为始终返回false,应用程序运行完全正常,只是它无法判断试用期何时过期。

可能会意外抛出FormatException,因为它依赖于区域设置。从MSDN页面:

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

您可能更希望使用。

可能会意外引发FormatException,因为它依赖于语言环境。从MSDN页面:

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


您可能更愿意使用。

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

则应该能够将其解析。由于具有不同的区域,其他计算机可能正在尝试将日期解析为dd/MM/yyyy。如果输入日期为“2010-10-20”,则应该能够对其进行解析。

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

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

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.");
}

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

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

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

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.");
}

这里,我们首先尝试使用当前区域性信息进行解析,然后使用不变的区域性信息。当然,这并不理想,但它非常适合我们的需要。

正确这就是我所做的,它对我的和客户都有效。谢谢。这是我做的,它对我和客户都有效。谢谢