2008-08-22 2 views
26

Кто-нибудь знает анализатор даты и времени .NET, аналогичный Chronic for Ruby (обрабатывает такие вещи, как «завтра» или «3 часа следующего дня»)?Анализатор времени/времени на естественном языке для .NET?

Примечание: Я пишу Ruby (как я знаю о Chronic), но этот проект должен использовать .NET.

+0

См. Ответ о NChronic http://stackoverflow.com/questions/14583285/clever-way-to-parse-dates-c-sharp/25588407#25588407 – 2016-07-02 13:56:49

ответ

11

Мы разработали именно то, что вы ищете для внутреннего проекта. Мы думаем об этом, если этого достаточно. Взгляните на этот блог для получения более подробной информации: http://precisionsoftwaredesign.com/blog.php.

Не стесняйтесь связаться со мной, если вы заинтересованы: [email protected]

Эта библиотека теперь проект SourceForge. Страница находится по адресу:

http://www.SourceForge.net/p/naturaldate

сборка находится в разделе загрузки, и источник доступен с Mercurial.

+0

Вы сделали ее общедоступной в конце? – 2011-03-04 15:15:56

2

Я не знаю одного, но это звучало как прохладный проблемы, так вот мой сильный удар у него (VB.NET):

Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String 
    Dim diff As TimeSpan = DateTime.Now().Subtract(d) 
    If diff.Duration.TotalMinutes < 1 Then Return "Now" 

    Dim str As String 
    If diff.Duration.TotalDays > 365 Then 
     str = CInt(diff.Duration.TotalDays/365).ToString() & " years" 
    ElseIf diff.Duration.TotalDays > 30 Then 
     str = CInt(diff.TotalDays/30).ToString() & " months" 
    ElseIf diff.Duration.TotalHours > 24 Then 
     str = CInt(diff.Duration.TotalHours/24) & " days" 
    ElseIf diff.Duration.TotalMinutes > 60 Then 
     str = CInt(diff.Duration.TotalMinutes/60) & " minutes" 
    Else 
     str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes" 
    End If 
    If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1) 
    If diff.TotalDays > 0 Then 
     str &= " ago" 
    Else 
     str &= " from now" 
    End If 
    Return str 
End Function 

Это действительно не так сложно, как те, которые уже существуют, но он работает хорошо, я думаю. Может быть хорошим методом расширения.

+3

Это не парсер вообще. – 2011-06-27 17:29:45

+0

обратный парсер? Еще хорошая вещь, может быть полезна. – nawfal 2014-01-30 09:56:10

1

@ Бертон: Я думаю, что он имел в виду другой путь, по крайней мере, из примера, на связанной странице:

Chronic.parse('tomorrow') 
    #=> Mon Aug 28 12:00:00 PDT 2006 

    Chronic.parse('monday', :context => :past) 
    #=> Mon Aug 21 12:00:00 PDT 2006 

    Chronic.parse('this tuesday 5:00') 
    #=> Tue Aug 29 17:00:00 PDT 2006 

Я думал, что взять удар у него тоже, пока я не понял! (хорошая реализация, хотя)

5

У меня нет, но есть Java-порт под названием jchronic. Если ничего другого, это могло бы стать хорошей точкой для прыжка. Или, возможно, вы можете использовать полуавтоматический переводчик Java на C#, например, Octopus, чтобы помочь его перевести. (Или что-то лучше, если кто-нибудь ничего не знает.)

Хорошо, еще один возможный путь: можете ли вы использовать хронический код, используя IronRuby?

4

@Blair Conrad - Хорошие идеи! Я пытался запустить Chronic под IronRuby, но имел некоторые проблемы с зависимостями - я не знаю, что он еще готов.

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

Это интересная проблема, и определенно помогла мне лучше понять регулярные выражения, поэтому я думаю, что буду продолжать работать над этим.

3

Раньше был similar thread, и он дал ссылку на библиотеку CodeProject, которая, кажется, делает то, что вы хотите: http://www.codeproject.com/KB/edit/dateparser.aspx, но, к сожалению, библиотека, похоже, написана в MFC, поэтому вам придется сделать из нее DLL и затем вызовите его из своей программы .NET.

3

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

«Сегодня в 2pm» «во вторник в 2pm - 15 июля 2010 года в 2 часа ночи» «Предыдущий год в 2 часа ночи - Завтра в 14:30» «18 июля 2010 at 2:45 pm "

Застрял на кодексе, так как, возможно, кому-то это будет полезно. Проверьте это: http://timestamper.codeplex.com/

3

Я проверил несколько фреймворков, и ParseDateTime Python работал лучше всех. Его можно использовать с .NET с помощью IronPython.

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

EDIT

В соответствии с просьбой, вот простой проект, который вы можете использовать с библиотекой:

http://www.assembla.com/code/relativedateparser/subversion/nodes

Попробуйте следующий случай использования, например:

  • 25 августа 2008 г.
  • 25 авг. 2 008
  • 25 августа 5 вечера
  • 5 вечера 25 августа
  • следующая суббота
  • завтра
  • следующий четверг в 4 часа
  • в 4 часа
  • EOD
  • завтра EOD
  • EOD вторнику
  • eoy
  • МНВ
  • в 5 минутах
  • 5 минут спустя
  • 5 часов до сих пор существует
  • 2 часа до полудня
  • 2 дней с завтрашнего дня
Смежные вопросы