0

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

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

为什么它不能在我的 VM 上解析客户端计算机上的日期?日期是硬编码的。我不明白这是怎么发生的。我确认客户端有 3.5,如果我将该行更改为始终返回 false,则应用程序运行得非常好,只是它无法判断试用期何时到期。

4

3 回答 3

5

DateTime.Parse可能会意外抛出 FormatException,因为它依赖于语言环境。从 MSDN 页面:

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

您可能更愿意使用DateTime.ParseExact.

于 2010-10-02T05:30:26.633 回答
1

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

于 2010-10-02T05:36:54.093 回答
0

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

在我们的系统中,由于错误要求实现,不同的客户端以两种不同的文化向我们的服务器组件发送 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.");
}

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

于 2010-10-02T07:20:32.300 回答