Frage

Kennt jemand einen ähnlichen .NET-Datums-/Uhrzeitparser? Chronisch für Ruby (behandelt Dinge wie „morgen“ oder „nächsten Donnerstag 15 Uhr“)?

Notiz:Ich schreibe zwar Ruby (daher kenne ich Chronic), aber dieses Projekt muss .NET verwenden.

War es hilfreich?

Lösung

Wir haben in einem internen Projekt genau das entwickelt, was Sie suchen.Wir denken darüber nach, dies zu veröffentlichen, wenn ein ausreichender Bedarf dafür besteht.Weitere Informationen finden Sie in diesem Blog: http://precisionsoftwaredesign.com/blog.php.

Bei Interesse können Sie mich gerne kontaktieren:contact@precisionsoftware.us

Diese Bibliothek ist jetzt ein SourceForge-Projekt.Die Seite ist unter:

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

Die Baugruppe befindet sich im Download-Bereich und die Quelle ist bei Mercurial erhältlich.

Andere Tipps

Ich nicht, aber es gibt einen Java-Port namens jchronisch.Wenn nichts anderes, könnte es ein guter Ausgangspunkt für Ihr eigenes sein.Oder vielleicht könnten Sie einen halbautomatischen Java-zu-C#-Übersetzer verwenden Oktopus um bei der Übersetzung zu helfen.(Oder etwas Besseres, falls jemand etwas weiß.)

Okay, ein weiterer möglicher Weg:Könnten Sie den chronischen Code verwenden? IronRuby?

Es gibt einen .NET-Port von Chronic.Sehen https://github.com/robertwilczynski/nChronic.Ich habe hier einen Fork davon mit einigen Verbesserungen und Fehlerbehebungen erstellt: https://github.com/dorony/nChronic (Pull-Anfragen gesendet, der Autor hat immer noch nicht geantwortet).

@Blair Conrad – Gute Ideen!Ich habe versucht, Chronic unter IronRuby zum Laufen zu bringen, hatte aber einige Probleme mit Abhängigkeiten – ich weiß nicht, ob es schon fertig ist.

Ich habe ein Projekt gefunden Codeplex (DateTimeEnglishParser), der das Gleiche versucht.Es hält noch nicht die Jahre oder die Zeit aus, aber es ist ein guter Anfang.Ich habe ein wenig an dem Projekt gearbeitet und einen Patch beigesteuert, um geschriebene Zahlen besser verarbeiten zu können.

Es ist ein interessantes Problem und hat mir definitiv dabei geholfen, reguläre Ausdrücke besser zu verstehen, also denke ich, dass ich weiter daran arbeiten werde.

Da war ein ähnlicher Thread früher und es gab einen Link zu einer Bibliothek auf CodeProject, die zu tun scheint, was Sie wollen: http://www.codeproject.com/KB/edit/dateparser.aspx Aber leider scheint die Bibliothek in MFC geschrieben zu sein, sodass Sie eine DLL daraus erstellen und sie dann von Ihrem .NET-Programm aus aufrufen müssten.

Palmsey, ich hatte erst kürzlich die gleiche Anforderung, also habe ich einen einfachen Parser geschrieben.Es ist nicht der schönste Code, aber er verarbeitet Dinge wie:

"Today um 14 Uhr" "Dienstag um 14 Uhr - 15. Juli 2010 um 2 Uhr morgens" "Vorjahr um 2 Uhr morgens - Tommorow um 14:30" "18. Juli 2010 um 14:45 Uhr"

Ich habe es auf Codeplex geklebt, da es vielleicht jemand anderes nützlich findet.Hör zu: http://timestamper.codeplex.com/

Ich habe mehrere Frameworks und Pythons überprüft ParseDateTime hat am besten funktioniert.Es kann aus .NET mit IronPython verwendet werden.

Wenn jemand an einem vollständigen Beispielprojekt interessiert ist, kommentieren Sie die Antwort und ich werde versuchen, eines zu erstellen.

BEARBEITEN

Wie gewünscht ist hier ein einfaches Projekt, das Sie mit der Bibliothek verwenden können:

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

Probieren Sie zum Beispiel den folgenden Anwendungsfall aus:

  • 25. August 2008
  • 25. August 2008
  • 25. August, 17 Uhr
  • 25. August, 17 Uhr
  • nächsten Samstag
  • morgen
  • nächsten Donnerstag um 16 Uhr
  • um 16.00 Uhr
  • eod
  • morgen eod
  • eod Dienstag
  • oje
  • eom
  • in 5 Minuten
  • In 5 Minuten
  • 5 Stunden vorher
  • 2 Stunden vor Mittag
  • In 2 Tagen ab morgen

Mir ist keins davon bekannt, aber es klang nach einem coolen Problem, also hier ist mein Ansatz dazu (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

Es ist wirklich nicht so ausgefeilt wie die, die es bereits gibt, aber ich denke, es funktioniert gut.Könnte eine schöne Erweiterungsmethode sein.

@Burton:Ich denke, er meinte es anders, zumindest anhand des Beispiels auf der verlinkten Seite:

  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

Ich dachte, ich würde es auch versuchen, bis mir klar wurde!(Aber schöne Umsetzung)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top