我需要处理部分日期,例如:
等等。
看着它,我不认为这是一个大问题,因为它只需要处理英国日期,所以全球化不是一个考虑因素。这个微不足道的位将解决用户输入50时的含义,这意味着1950或2050年。
在我真正涉足并重新发明轮子之前,我之前是否曾在某些代码中将其用作参考或直接使用?
更新Clarity
部分日期将用于存储25岁以下人士的出生日期。
关于如何显示数据:
用户输入:01/00
解释为:Jan / 2000
显示为:2000年1月
用户输入:01/01/99
解释为:1999年1月1日
显示为:1999年1月1日
答案 0 :(得分:1)
如果我们通过DateTime.Parse放置这些值,那么唯一导致问题的是最后一个,因为它不包含任何形式的日期指示:
Console.WriteLine(DateTime.Parse("1 April 2009"));
// Outputs 01/04/2009 00:00:00
Console.WriteLine(DateTime.Parse("Jan 2000"));
// Outputs 01/01/2000 00:00:00
Console.WriteLine(DateTime.Parse("March 90"));
// Outputs 01/03/1990 00:00:00
Console.WriteLine(DateTime.Parse("00"));
// Throws an exception
然而,将Jan放在最后一个字符串的开头给我们:
Console.WriteLine(DateTime.Parse("Jan 00"));
// Outputs 01/01/2000 00:00:00
所以,或许一个有点hacky的解决方案是正则表达式匹配任何仅包含2或4个数字的字符串,并在其前面添加文本“Jan”?
String sample = "00";
//check for 2 or 4 numbers in the string, nothing else
//except space before and after
if (Regex.IsMatch(sample, @"^\s*(\d{2}|\d{4})\s*$"))
{
sample = "Jan " + sample;
}
Console.WriteLine(DateTime.Parse(sample));
// Outputs 01/01/2000
如果样本为00,2000或任何其他2或4位(加空格)字符串,那也将有效。
评论中指出的3/00字符串是一个doozy,如果它的前缀为0,或者如果“/”替换为空格,则DateTime不会除外。 您需要做的是检查包含“/”后跟2位数字的字符串,然后将这两个数字加上“20”前缀,得到“3/2000”,解析好了。
令人讨厌的是,DateTime.Parse方法不允许检测它在解析时找到的空字段(它只是将它们检测为月/年的开始)。
也许,作为一个UI建议,当用户输入这个疯狂的日期字符串时,不是在放入数据库时过于聪明,而是在提交表单(是Web表单吗?)时解析它。如果格式没有立即清楚,建议用户可能,例如,您的意思是1950年还是2050年?