【问题标题】:Handling partial/incomplete dates in .NET在 .NET 中处理部分/不完整的日期
【发布时间】:2009-11-03 15:47:17
【问题描述】:

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

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

等等。

我认为这不是一个大问题,因为它只需要处理英国日期,所以全球化不是一个考虑因素。棘手的问题是用户输入 50 时的含义是什么,这意味着 1950 还是 2050。

在我真正涉足并重新发明轮子之前,之前是否在一些我可以用作参考或直接使用的代码中完成了这项工作?

清晰度更新

部分日期将用于存储未满 25 岁的人的出生日期。

至于数据将如何显示:

用户输入:01/00

解释为:2000 年 1 月

显示为:2000 年 1 月

用户输入:01/01/99

解释为:1/Jan/1999

显示为:1999 年 1 月 1 日

【问题讨论】:

  • 你想用这些日期做什么?
  • 不清楚你的意思。 2000 年 1 月代表 2000 年 1 月 1 日还是 2000 年 1 月代表 2000 年 1 月的所有日期?
  • 它们将被转储到 sql 数据库中的 3 个单独的字段中,并将被拼接在一起以进行显示。因此,当用户输入 3/00 时,我们将提取 2000 年 3 月并在系统中显示。
  • 您应该阐明所有示例应该如何显示。

标签: .net date


【解决方案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

所以,也许一个稍微老套的解决方案是正则表达式匹配任何仅由 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 字符串是一个笨拙的字符串,如果它以 0 为前缀,或者如果“/”被替换为空格,则 DateTime 不会将其排除在外。 您需要做的是检查包含“/”后跟 2 位数字的字符串,然后在这两个数字前加上“20”,得到“3/2000”,解析成功。

令人讨厌的是,DateTime.Parse 方法不允许检测它在解析时发现的空字段(它只是将这些字段检测为月/年的开始)。


也许,作为一个 UI 建议,当用户在输入这个疯狂的日期字符串时,不要在放入数据库时​​尝试太聪明,而是在提交表单(是 Web 表单吗?)时解析它。如果格式不是很清楚,请向用户提出可能的建议,例如,您是指 1950 年还是 2050 年?

【讨论】:

  • 好的 UI 建议。 尽早确认日期,并立即将其提供给有知识的人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多