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

Датчик времени/времени для .NET?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

ИЗМЕНИТЬ

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

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

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

  • 25 августа 2008 г.
  • 25 августа 2008 г.
  • 25 августа 17:00
  • 5pm 25 августа
  • следующая суббота
  • завтра
  • следующий четверг в 16:00
  • в 16:00
  • ОВБ
  • завтра eod
  • eod tuesday
  • EOY
  • МНВ
  • через 5 минут
  • Через 5 минут
  • 5 часов до этого времени
  • 2 часа до полудня
  • 2 дня с завтрашнего дня

Ответ 8

Я не знаю об этом, но это звучит как крутая проблема, поэтому вот мой удар в этом (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

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

Ответ 9

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

  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

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