我有以下代码:
DateTime.TryParse("06-28-2012", new System.Globalization.CultureInfo("en-NZ"),
System.Globalization.DateTimeStyles.AssumeLocal, out date);
我不确定为什么这会返回true,因为如果我进入Windows的区域设置,我只会在短日期内看到以下日期格式:
那么为什么像MM-dd-yyyy这样的短日期格式会返回true?它不应该返回假吗?
我使用这个类似的帖子作为来源:DateTime c# parsing
重要的: 请注意,我的区域设置也设置为使用英语(新西兰)并选择 yyyy-MM-dd作为我的短日期格式。
答案 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]?");
应该符合您的需求,同时仍然允许一些灵活性。