c# parse 如何在.Net中處理含糊的日期



datetime c# define (7)

你可以創建自己的結構(用戶定義類型)的日期時間,這將允許00月份和00日期...然後還實現icomparable,所以你可以做它的數學/ comparrisons。

http://msdn.microsoft.com/en-us/library/k69kzbs1%28v=vs.71%29.aspx
http://msdn.microsoft.com/en-us/library/system.icomparable.aspx

我有一個系統,從外部來源獲取信息,然後將其存儲在稍後顯示。

其中一個數據項是日期。 在源系統上,它們具有模糊日期的概念,即對於特定日期或者有時不到一個月也不准確。 所以我得到格式的日期:

dd/mm/yyyy
mm/yyyy
yyyy

我可以解析這些DateTime對象,並與這些工作,但在渲染後,我需要能夠確定日期的準確性,因為解析“2010”將導致日期“01/01/2010”。 我想只顯示一年,所以需要知道它的原始準確性。

我嘲笑了一個快速的課來處理這個問題:

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

public enum DateType
{
    DayMonthYear,
    MonthYear,
    Year
}

這將為我做這個工作,我可以做一些處理它的解析,但我覺得這可能是一個很常見的問題,可能有一個更清潔的解決方案。

有沒有內置到.Net來做到這一點? 我看了一下文化的東西,但看起來不太合適。

任何幫助,將不勝感激。


當我開始閱讀你的問題時,我迅速得出結論,答案是實現你自己的FuzzyDate類。 瞧,那正是你所做的。

我可以想像,您可能希望隨著時間的推移添加功能(例如考慮DateType的比較)。

我不相信在.NET Framework中會有內在的幫助,所以我認為你做的是正確的。


據我所知,沒有內置到.NET中的這個,我會去的解決方案是基於可空值的東西,就像這樣。

public class FuzzyDate
{
    private int Year;
    private int? Month;
    private int? Day;

    public FuzzyDate(int Year, int? Month, int? Day)
    {
        this.Year = Year;
        this.Month = Month;
        this.Day = Day;
    }

    public DateType DateType
    {
        get
        {
            if(Day.HasValue && Month.HasValue)
            {
                return DateType.DayMonthYear;
            }
            else if(Month.HasValue)
            {
                return DateType.MonthYear;
            }
            else
            {
                return DateType.Year;
            }
        }
    }

    public DateTime Date
    {
        get
        {
            return new DateTime(Year, Month.GetValueOrDefault(1), Day.GetValueOrDefault(1));
        }
    }
}

public enum DateType
{
    DayMonthYear,
    MonthYear,
    Year
}

在我看來你的做法是正確的。 它確實是.NET DateTime支持多種格式,但我想,如果所有這些都支持一個步驟(納秒)的概念,那麼將與特定的日期和時間有關。


為了回答你的問題:沒有什麼內置的.NET來處理這個優雅。

你的解決方案和我見過的一樣有效。 您可能希望用ToString()方法重寫您的類,以便根據DateType適當地生成日期。

這裡有一些其他線程試圖解決這個問題:

祝你好運!


我想你正走在正確的路上。 沒有“模糊”的日期或部分日期的概念,你將需要建立自己的。

例如,您可能需要更多的構造函數方法

public FuzzyDate(int year)
{
   Date = new DateTime(year,1,1); // 1 Jan yy
   Type = DateType.Year;
}

public FuzzyDate(int year, int month)
{
   Date = new DateTime(year, month, 1); // 1 mm yy
   Type = DateType.MonthYear;
}

public FuzzyDate(int year, int month, int day)
{
   Date = new DateTime(year, month, day); // dd mm yy
   Type = DateType.DayMonthYear;
}

希望這有助於凱文


如果您的數據類型將始終處理特定的時間段(即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";
    }
}




datetime