Как работать с неопределенными датами в.Net

У меня есть система, которая принимает информацию из внешнего источника и затем сохраняет ее для последующего отображения.

Один из элементов данных - это Дата. В исходной системе у них есть концепция нечеткой даты, то есть не точной до определенного дня, а иногда и не до месяца. Итак, я получаю даты в формате:

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 для этого? Я взглянул на культуру, но это показалось мне неправильным.

Любая помощь будет признательна.

27
задан colethecoder 27 July 2011 в 16:12
поделиться

1 ответ

Если ваш тип данных всегда будет обрабатывать определенные периоды времени (т. Е. 1972 год - это определенный период времени, но 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";
    }
}
6
ответ дан 28 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: