2014-02-17 16 views
0

我有以下代码:当MMddyyyy传入时,为什么DateTime.TryParse()为文化“en-NZ”返回true?

DateTime.TryParse("06-28-2012", new System.Globalization.CultureInfo("en-NZ"), 
System.Globalization.DateTimeStyles.AssumeLocal, out date); 

我不知道为什么,因为如果我去到Windows我的区域设置,这是返回true,我只看到下短日期以下日期格式:

  • d /月/年
  • d/MM/YY
  • DD/MM/YY
  • d.MM.yy
  • yyyy-MM-dd

那么为什么像MM-dd-yyyy这样的短日期格式返回true?它不应该返回错误吗?

我用这个类似的帖子作为源:DateTime c# parsing

重要提示: 请注意,我也有我的区域设置设置为使用英语(新西兰),并选择 YYYY-MM-DD因为我短日期格式。

+0

这将返回false在我的。相同[这里](http://ideone.com/JeKCk6)。你如何测试它? – ken2k

+0

在VS2012上使用立即窗口 – SpartaSixZero

回答

1

有你的短日期格式设置为yyyy-MM-dd是此行为(如果在新西兰的标准,但新西兰的短日期设置为d/MM/yyyy我的电脑上我不知道)的原因。我不知道Dot Net或底层Windows API是否应该受到指责,但它似乎足够聪明,可以理解4位数部分代表年份,之后它只保留月份日订单(请注意,调用DateTime.TryParse("28-06-2012")实际上会失败)。

您可以尝试使用ParseExact,但被警告,这将在弦上的丝毫改变失败(例如,使用一个点或作为分隔符斜线,而不是短跑。

当在我看来,因为它可以处理更多的案例,所以最好保持行为不变,但是如果您确实必须检查日期字符串是否处于指定的(灵活的)格式,则Regex是最佳选择。例如Regex.IsMatch("2012/06/28", @"[0-9][0-9][0-9][0-9][./\\][0-9][0-9]?[./\\][0-9][0-9]?");应该适合您需要,同时仍然允许一些灵活性。

1

你可以尝试DateTime.ParseExact

你能执行和发布从下面的代码,结果呢?

System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern; 
System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.DateSeparator; 
+0

首先一个是“yyyy-MM-dd”。第二个是“ - ” – SpartaSixZero

相关问题