DateTime.TryParse问题,可能与IIS中的全球化设置有关

时间:2016-04-15 10:01:49

标签: c# .net datetime globalization

基本上,我正在阅读excel文件,其中一列的日期格式如下:dd/MM/yyyy例如:11/04/2016

当我使用DateTime.TryParse()将该字符串解析为datetime方法TryParse()处理的第一个数字(如月份)(上例中的数字11)。但是,在其他计算机上运行的相同代码将使用第二个数字(上例中的04)作为月份。

所以我的问题是为什么它们之间存在差异,究竟是什么决定了TryParse方法的行为?

2 个答案:

答案 0 :(得分:0)

我认为主要区别在于IFormatProvider(很难说我是否无法检查目标系统中的某些设置),但我通常使用其他方法来获取正确的DateTime对象:

DateTime someDate = DateTime.ParseExact(myStringDate, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);

无论客户端环境如何配置,它总能给我我想要的东西。

希望这会有所帮助。 :)

答案 1 :(得分:-1)

来自DateTime.TryParse(String, DateTime) documentation

  

因为DateTime.TryParse(String, DateTime)方法试图解析   使用格式设置的日期和时间的字符串表示形式   当前文化的规则,试图解析一个特定的字符串   跨越不同文化可能会失败或返回不同的结果。   如果将跨不同的方式解析特定的日期和时间格式   locales,使用   DateTime.TryParse(String, IFormatProvider, DateTimeStyles, DateTime)   方法或TryParseExact方法的重载之一并提供   格式说明符。

这意味着您的计算机具有不同的文化设置,这些设置指向CurrentCulture property

看起来一台计算机的当前文化具有dd/MM/yyyy,而另一台计算机的当前文化具有MM/dd/yyyy作为标准日期和时间格式。

由于您确定自己的值始终采用dd/MM/yyyy格式,因此我会使用DateTime.ParseExact代替Datetime.TryParseDateTime.TryParseExact方法;

var dt = DateTime.ParseExact(yourColumnValue, "dd/MM/yyyy", CultureInfo.InvariantCulture);

或者,您可以将所有计算机的当前文化设置为与第一台计算机相似,但请记住CultureInfo data is not a stable data 可能将来使用Windows更新,.NET Framework版本或操作系统版本进行更改。