当MMddyyyy传入时,为什么DateTime.TryParse()为文化“en-NZ”返回true?

时间:2014-02-17 16:20:20

标签: c# datetime

我有以下代码:

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

我不确定为什么这会返回true,因为如果我进入Windows的区域设置,我只会在短日期内看到以下日期格式:

  • d /月/年
  • d / MM / YY
  • DD / MM / YY
  • d.MM.yy
  • YYYY-MM-DD

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以尝试DateTime.ParseExact

您可以执行并发布以下代码的结果吗?

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

答案 1 :(得分: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]?");应该符合您的需求,同时仍然允许一些灵活性。