Нечеткая библиотека управления датой и временем для .NET - PullRequest
7 голосов
/ 03 августа 2011

Я ищу библиотеку .NET, которая может хранить и управлять нечеткими (то есть неопределенными) датами / временем, то есть временными выражениями, которые не соответствуют обычному точному шаблону дня, месяца, года, часа, минуты, секунды. , Мне нужно что-то, что может обрабатывать значения даты / времени, выраженные, например, как:

  • Второй квартал 1985 года
  • начало 1930-х
  • Вторая треть XVII века

Библиотека, вероятно, будет реализовывать тип FuzzyDateTime или что-то в этом роде и позволять создавать его экземпляры из текста и / или обычных значений DateTime несколькими способами. Также требуются функции сравнения и сортировки.

Итак, мой вопрос: знаете ли вы какие-либо доступные продукты, которые соответствуют этому описанию? Я рад рассмотреть все виды продуктов, например, коммерческие, с открытым исходным кодом, бесплатные и т. Д.

Есть идеи? Большое спасибо.

Ответы [ 2 ]

7 голосов
/ 04 августа 2011

Вам, вероятно, придется кодировать это с нуля.Может быть, есть библиотека Java, которую вы могли бы преобразовать, но кажется, что этот тип функциональности в настоящее время является предметом научного исследования, а не находится в производстве в разных местах.В конце концов, вы можете использовать что-то академическое, но вам, вероятно, придется кодировать свой собственный в зависимости от ваших потребностей.

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

class UncertainDate
{
    public byte? Millennium { get; set; }
    public byte? Century { get; set; }
    public byte? Decade { get; set; }
    public byte? Year { get; set; }
    public byte? Month { get; set; }
    public byte? Day { get; set; }
    // more as you see fit

    public decimal Uncertainty { get; set; }
}

Например, «первый квартал 2000 года» будет представлен как:

var d = new UncertainDate() { Millennium = 2, Century = 0, Decade = 0, Year = 0, Uncertainty = 0.25m };

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

Вы также можете использовать перечисление для неопределенности, может быть значения, такие как FirstQuarter, FirstHalf, Early, Late, ThirdQuarter и т. Д. Десятичное число облегчает относительные сравнения, но труднее обратного преобразования в такие вещи, как «вторая половина» (то есть 0,75 будет «вторымполовина "или" третий квартал "?)

Для справки было похожих вопросов заданных вопросов.

3 голосов
/ 04 августа 2011

Я не знаю ни одной библиотеки / продукта, хотя могу представить, что этот момент, по крайней мере, рассматривался в любом из «семантических» полей (таких как семантическая сеть и т. Д.).

ЕСЛИ Японять, что вам нужно (особенно когда вы хотите сортировать и т. д.), тогда эти «нечеткие» вещи - это просто «интервалы» между двумя конкретными моментами времени ...

Вы можете создать класс, содержащий 2 DateTimes ... Start и End ... или Start плюс продолжительность ...Добавьте к этому любое представление, которое вы можете себе представить ... Некоторые конструкторы интерпретируют то, что вы хотите бросить в них (например, что-то, что «знает», что означает «рано» или «четверть») и строит из этого соответствующие начало и конец.

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

Что касается хранения, вы можете сделать его сериализуемым ...

...