处理.NET中的部分/不完整日期

时间:2009-11-03 15:47:17

标签: .net date

我需要处理部分日期,例如:

  • 2009年4月1日(存储为1,4,200)
  • 2000年1月(存储为null,1,2000)
  • 3月90日(存储为null,3,1990)
  • 00(存储为null,null,2000)

等等。

看着它,我不认为这是一个大问题,因为它只需要处理英国日期,所以全球化不是一个考虑因素。这个微不足道的位将解决用户输入50时的含义,这意味着1950或2050年。

在我真正涉足并重新发明轮子之前,我之前是否曾在某些代码中将其用作参考或直接使用?

更新Clarity

部分日期将用于存储25岁以下人士的出生日期。

关于如何显示数据:

用户输入:01/00

解释为:Jan / 2000

显示为:2000年1月

用户输入:01/01/99

解释为:1999年1月1日

显示为:1999年1月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年?