Вам, вероятно, придется кодировать это с нуля.Может быть, есть библиотека 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 будет «вторымполовина "или" третий квартал "?)
Для справки было похожих вопросов заданных вопросов.