C# DateTime解析在其他服务器上的行为完全不同

C# DateTime解析在其他服务器上的行为完全不同,c#,windows,datetime-format,C#,Windows,Datetime Format,我有一段代码在测试服务器上崩溃,而不是在开发服务器上崩溃。我有两台Windows 2012R2服务器用于开发和测试。两者都在相同的修补程序级别,相同的.NET FrameWork版本。对于当前用户和本地系统,两者具有相同的区域设置(荷兰语)。这个荷兰语设置有-作为日期分隔符。以下代码段在dev服务器上工作,但在测试服务器上崩溃。我在一个控制台应用程序中添加了带有2行代码的代码段,然后我可以重现错误 这段代码(对于演示控制台应用程序简化)是: 所以这在我的开发服务器上工作,并在测试中崩溃 我得到这

我有一段代码在测试服务器上崩溃,而不是在开发服务器上崩溃。我有两台Windows 2012R2服务器用于开发和测试。两者都在相同的修补程序级别,相同的.NET FrameWork版本。对于当前用户和本地系统,两者具有相同的区域设置(荷兰语)。这个荷兰语设置有-作为日期分隔符。以下代码段在dev服务器上工作,但在测试服务器上崩溃。我在一个控制台应用程序中添加了带有2行代码的代码段,然后我可以重现错误

这段代码(对于演示控制台应用程序简化)是:

所以这在我的开发服务器上工作,并在测试中崩溃 我得到这个例外

Unhandled Exception: System.FormatException: String was not recognized as a vali
d DateTime.
   at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInf
o dtfi, DateTimeStyles style)
   at System.DateTime.ParseExact(String s, String format, IFormatProvider provid
er)
当我将代码更改为

        string date = "28/02/2017";
        DateTime dateDate = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture);
它可以在两台服务器上工作。当我在控制台应用程序中输出CurrentCultue和CurrentUiCulture时,它们在两台服务器上都是相同的

你知道我的测试服务器会出什么问题吗?当我在ParseExact方法中传递null时,我希望代码也会在我的dev服务器上崩溃,因为应该使用CurrentCulture,然后日期分隔符/会导致错误

问候
Danny

null
指定要使用当前区域性,而不是传递
CultureInfo.InvariantCulture

:

如果提供程序为
null
,则与 使用当前区域性

/
在解析日期时间时具有特殊意义。它们将替换为当前区域性的
DateSeparator

你也可以掩盖它们:

DateTime dateDate = DateTime.ParseExact(date, "dd'/'MM'/'yyyy", null);

/
字符不会以日期格式字符串进行逐字解释。根据使用的格式提供程序,它将被日期分隔符替换

您需要将
/
括在单引号中,使其成为格式字符串中的文字字符:

"dd'/'MM'/'yyyy"

测试服务器崩溃这意味着什么?您会遇到什么异常?您应该为解析日期指定区域性,无论如何这确实有效。但是,在我的第一台服务器上,它怎么可能在没有“”的情况下工作,而在我的第二台服务器上,它怎么可能导致异常,即使它们具有相同的区域性设置?@DannyH:我不知道。要么测试不同,要么文化设置不一样,即使你说它们是一样的。查看计算机的区域设置。当我传递格式“dd/MM/yyyy”时,我做了一个DateTime来字符串/没有特殊意义吗?这很好。@DannyH:如果您使用
DateTime.ToString
无需解析任何内容,因此没有异常。但它也将用当前区域性的实际日期分隔符替换
/
(如果未将
不变量区域性作为第二个参数传递给
ToString
)。在德国这里f.e.
DateTime.Now.ToString(“dd/MM/yyyy”)
返回
2017年3月10日
"dd'/'MM'/'yyyy"