datetime - Датчик времени / времени для.NET?[закрыто]




nlp (9)

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

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


Answers

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

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

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

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

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


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

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

РЕДАКТИРОВАТЬ

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

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

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

  • 25 августа 2008 г.
  • 25 августа 2008 г.
  • 25 августа 17:00
  • 17:00 25 августа
  • в следующую субботу
  • завтра
  • следующий четверг в 16:00
  • в 16:00
  • EOD
  • завтра
  • эод вторник
  • EOY
  • МНВ
  • через 5 минут
  • Через 5 минут
  • 5 часов до этого
  • 2 часа до полудня
  • 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

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


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

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


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

  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

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


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


Палми, у меня недавно было одно и то же требование, поэтому я пошел вперед и написал простой парсер. Это не самый приятный код, но он будет обрабатывать такие вещи, как:

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

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


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

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

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


+---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5 x 10-45 to ±3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ±1.0 x 10-28 to ±7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+

Для получения дополнительной информации см.
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5





.net datetime nlp