C# 为什么文化的DateTime.TryParse()返回true;en NZ“;何时传入mmddyyy?

C# 为什么文化的DateTime.TryParse()返回true;en NZ“;何时传入mmddyyy?,c#,datetime,C#,Datetime,我有以下代码: DateTime.TryParse("06-28-2012", new System.Globalization.CultureInfo("en-NZ"), System.Globalization.DateTimeStyles.AssumeLocal, out date); 我不确定为什么会返回真值,因为如果我在Windows中进入我的区域设置,我只会在“短日期”下看到以下日期格式: 年月日 年月日 年月日 d、 年月日 年月日 那么,为什么像MM dd yyyy这样的短

我有以下代码:

DateTime.TryParse("06-28-2012", new System.Globalization.CultureInfo("en-NZ"),
System.Globalization.DateTimeStyles.AssumeLocal, out date);
我不确定为什么会返回真值,因为如果我在Windows中进入我的区域设置,我只会在“短日期”下看到以下日期格式:

  • 年月日
  • 年月日
  • 年月日
  • d、 年月日
  • 年月日
那么,为什么像MM dd yyyy这样的短日期格式会返回真值呢?它不应该返回false吗

我用这篇类似的文章作为来源:

重要: 请注意,我的区域设置也设置为使用英语(新西兰)并选择 yyyy MM dd作为我的短日期格式。

您可以尝试

你能执行并发布下面代码的结果吗

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

将短日期格式设置为
yyyy-MM-dd
是导致此行为的原因(我不知道新西兰的标准是否如此,但我的计算机上新西兰的短日期设置为
d/MM/yyyy
)。我不知道是dotnet还是底层的windowsapi造成的,但它似乎足够聪明,可以理解4位数字部分代表年份,之后它只保留月-日顺序(请注意,调用
DateTime.TryParse(“28-06-2012”)
实际上会失败)

您可以尝试使用ParseExact,但会收到警告,如果字符串稍有更改(例如,使用点或斜杠作为分隔符而不是破折号),则将失败


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

这在我的上返回false。相同。您如何测试它?在VS2012上使用即时窗口第一个是“yyyy-MM-dd”。第二个是“-”