У меня есть система, которая принимает информацию из внешнего источника и затем сохраняет ее для последующего отображения.
Один из элементов данных - это Дата. В исходной системе у них есть концепция нечеткой даты, то есть не точной до определенного дня, а иногда и не до месяца. Итак, я получаю даты в формате:
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 для этого? Я взглянул на культуру, но это показалось мне неправильным.
Любая помощь будет признательна.
Если ваш тип данных всегда будет обрабатывать определенные периоды времени (т. Е. 1972 год - это определенный период времени, но 4 июля не является конкретным), вы можете сохранить свои данные как время начала и временной интервал.
Вот возможная реализация:
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";
}
}