如何处理.Net中的模糊日期

col*_*der 27 .net c# datetime

我有一个系统从外部源获取信息,然后存储它以便稍后显示.

其中一个数据项是日期.在源系统上,他们具有模糊日期的概念,即不准确到特定日期或有时不精确到一个月.所以我得到以下格式的日期:

dd/mm/yyyy
mm/yyyy
yyyy
Run Code Online (Sandbox Code Playgroud)

我可以将这些解析为DateTime对象并使用它们但是在稍后渲染时我需要能够确定日期的准确性,因为解析"2010"将导致日期为"01/01/2010".我想展示一年,所以需要知道它的原始准确性.

我已经嘲笑了一个快速的课程来解决这个问题:

public class FuzzyDate
{
    public DateTime Date { get; set; }
    public DateType Type { get; set; }
}

public enum DateType
{
    DayMonthYear,
    MonthYear,
    Year
}
Run Code Online (Sandbox Code Playgroud)

这将为我完成工作,我可以在解析上做一些事情来处理它但我觉得这可能是一个非常常见的问题,并且可能存在一个现有的清洁解决方案.

有什么内置的.Net来做这件事吗?我看了一下文化的东西,但这看起来并不合适.

任何帮助,将不胜感激.

Mic*_*mes 14

回答你的问题:.NET没有内置任何东西来优雅地处理这个问题.

您的解决方案与我见过的一样有效.您可能希望使用覆盖修饰您的类ToString()方法,该方法将根据DateType适当地呈现您的日期.

以下是其他一些尝试解决此问题的线程:

祝好运!


Ste*_*gan 6

当我开始阅读你的问题时,我很快得出结论,答案是实现你自己的FuzzyDate类.瞧,这正是你所做的.

我可以想象您可能希望随着时间的推移添加功能(例如考虑DateType的比较).

我不相信在.NET Framework中有任何本质上可以帮助你的东西,所以我认为你做的是正确的.


Gab*_*abe 6

如果您的数据类型始终处理特定的时间段(即1972年是特定时间段,但7月4日不具体),您可以将数据存储为开始时间跨度.

  • 如果您的日期是"1972",则开始日期为19720101,时间跨度为366天.
  • 如果您的日期是"07/1972",则开始日期为19720701,时间跨度为31天.
  • 如果您的日期是"04/07/1972",则开始日期为19720704,时间跨度为1天.

这是一个可能的实现:

public struct VagueDate
{
    DateTime start, end;

    public DateTime Start { get { return start; } }
    public DateTime End { get { return end; } }
    public TimeSpan Span { get { return end - start; } }

    public VagueDate(string Date)
    {
        if (DateTime.TryParseExact(Date, "yyyy", null, 0, out start))
            end = start.AddYears(1);
        else if (DateTime.TryParseExact(Date, "MM/yyyy", null, 0, out start))
            end = start.AddMonths(1);
        else if (DateTime.TryParseExact(Date, "dd/MM/yyyy", null, 0, out start))
            end = start.AddDays(1);
        else
            throw new ArgumentException("Invalid format", "Date");
    }

    public override string ToString()
    {
        return Start.ToString("dd/MM/yyyy") + " plus " + Span.TotalDays + " days";
    }
}
Run Code Online (Sandbox Code Playgroud)