Подтвердить что ты не робот

Существует ли стандартный способ представления неопределенных дат в С#?

Я играю с некоторыми историческими данными, в которых некоторые даты я точно знаю (т.е. dd/mm/yyyy), в то время как другие просто yyyy, а другие - yyyy? (т.е. год неопределен). Я даже встретил фл, что, по-видимому, означает "процветать".

В настоящий момент я использую класс DateTime, который, похоже, не поддерживает флагов/представление такой неопределенности. Существует ли стандартный способ решения этой проблемы?

4b9b3361

Ответ 1

Существуют различные научные статьи о способах представления приблизительного времени, например http://www.musiccog.ohio-state.edu/Humdrum/representations/date.rep.html

Если вы хотите обрабатывать полный объем исторических документов и приблизительное знание, которое у вас будет для любого из них, это не простая операция bool/nullable с значениями DateTime.

Я еще не видел библиотеку С#. Мой собственный движок Natural Language Engine для С# может понимать все виды фраз даты, но был разработан для другой проблемы - он может принять неточный вопрос и запросить базу данных точных значений.

Он имеет классы для определенной даты, диапазон дат, известный год (но не месяц/день), известный год + месяц (но нет даты), полубесконечный диапазон (например, до или после данного дата),... и используя их, он может создавать запросы к базам данных или может перечислять все возможные диапазоны дат, которые можно было бы использовать. например вы можете спросить его "кто звонил в прошлом году в пятницу через 4 часа дня", и он может генерировать соответствующий SQL-запрос.

Если вы хотите сделать это правильно, это не просто! Если бы я был вами, я бы взял строковое значение с исходным текстом в нем вместе с любым представлением, которое вы выбрали для значений DateTime. Таким образом, вы можете сделать представление более умным с течением времени, чтобы охватить больше случаев, в конечном счете, имея возможность обрабатывать что-то вроде "где-то между 1940 и 16 сентября 1945 года.

Первоначально вы можете захотеть сохранить только строковое представление и два значения DateTime - как можно раньше и самую последнюю возможную дату. Это охватывает большинство случаев, которые вы увидите, и с ними действительно легко ответить. Вы можете оставить либо значение Datetime null, либо, возможно, установить максимальное или минимальное значение для представления полубесконечных диапазонов, например "после 1900".

Ответ 2

Я бы подумал о создании класса, который обертывает DateTime (или DateTimeOffset) и имеет дополнительные поля, чтобы представлять, какие части даты являются определенными, а какие нет.

Затем вы можете выставлять поля месяца, дня и года как значения с нулевым значением, чтобы отражать, какие части даты известны.

Ответ 3

Если неопределенность двоичная (т.е. дата либо известна, либо неизвестна), я бы пошел с нулевым типом DateTime. В противном случае я бы подумал о создании структуры-оболочки с дополнительным свойством enum:

public enum DateConfidence
{
     Certain,
     Unknown,
     YearOnly,
     ApproximateYearOnly
}

Ответ 4

DateTime? имеет значение NULL. Это может быть вашим лучшим выбором. Другой альтернативой является DateTime.MinValue (или MaxValue).

[Edit] Собственно, перечитывая свой вопрос, я думаю, что лучше всего создать специальный класс, который будет служить вашей конкретной цели.

Ответ 5

Радиоуглеродное датирование было бы типичным примером этого. Вам нужен класс с двумя членами. Угадаемая дата и оценка ошибки. Последнее обычно выражается годами, но вы можете выбрать любую единицу. Помните, что DateTime не может выразить дату до 0 BCE, поэтому сделайте ее простой int за год. Избегайте делать это более фантастическим, чем это, угадать правильный месяц бессмысленно для любой даты до 1000 года.

Ответ 6

Нет такого класса в .Net, поэтому лучше всего создать свой собственный класс с нулевыми свойствами, представляющими все необходимые поля даты.

Это даст вам максимальную гибкость в будущем и позволит обрабатывать любой сценарий, который у вас может быть (если нет - вы просто реорганизуете свой класс, а компилятор поможет вам найти места, где должно быть выполнено исправление).

Ответ 7

Моим преимуществом такой ситуации было бы создание объекта диапазона дат со степенью определенности.

Что-то вроде:

public struct HistorialDateRange
{
    public DateTime StartDate { get; }
    public DateTime EndDate { get; }
    public double Confidence { get; } /* range [0.0, 1.0] */
}

Тогда у меня была бы серия конструкторов, которые позволили бы мне установить год, месяц или одну дату, каждая с доверительным значением. Уверенность дает мне "резиновое" число для нечетких сравнений.

Если я установил один день, StartDate и EndDate должны включить эту дату.

Затем вам нужно выяснить, как определить сравнения между объектами HistorialDateRange. Я ожидал бы методов, которые позволят мне спросить, являются ли они разными, перекрываются и т.д.

Надеюсь, что это поможет.

Ответ 8

Немного за пределами поля ответьте на вашу проблему.

Если вы имеете дело с неструктурированными историческими данными, как вы описываете, я на самом деле пойму их как строку - как есть. Фактический смысл данных исходит из контекста того, где он используется. Вы можете утверждать, что мы теряем смысл, но на самом деле принудительное использование таких данных с большим количеством значений NULL/произвольное значение для объекта DateTime так же нецелесообразно. Возьмем это как пример:

  • 1910 - 1929
  • < 1960 или до 1960 года.
  • июль 1950 г. или после июля 1950 г.

  • 1950 - настоящее время или 1950 - сейчас

Если вы не можете удовлетворить любые возможности, раннее отображение текста периода в объект структуры, такой как DateTime, может потенциально потерять данные. Возьмите Now/Present в качестве примера, это относительное значение, которое следует заменить только тогда, когда оно используется не при анализе или преобразовании значения. Как вы можете хранить до и после определенной даты? Разумеется, с большим количеством работы по моделированию вы можете структурировать всю эту информацию для всех возможностей.

Текст периода должен интерпретироваться в контексте того, когда и как он используется, и вы можете использовать любой метод парсинга или парсинг естественного языка, если это вам подходит. Если синтаксический анализ не удается, вы всегда можете его улучшить, но вы не должны терять семантический смысл данных в самом начале, когда вы читаете или переносите их.