Parser data / ora in linguaggio naturale per .NET?

Qualcuno sa di un analizzatore di data / ora .NET simile a Chronic for Ruby (gestisce cose come “tomorrow” o “3pm next thursday”)?

Nota: scrivo Ruby (che è come so su Chronic) ma questo progetto deve usare .NET.

Io no, ma c’è una porta Java chiamata jchronic . Se non altro, potrebbe fornire un buon punto di partenza per il tuo. O forse potresti usare un traduttore semi-automatico da Java a C # come Octopus per aiutarti a tradurlo. (O meglio, se qualcuno sa qualcosa.)

Ok, un’altra ansible via: potresti usare il codice cronico usando IronRuby ?

Esiste una porta .NET di Chronic. Vedi https://github.com/robertwilczynski/nChronic . Ho creato un fork di esso con alcuni miglioramenti e correzioni di bug, qui: https://github.com/dorony/nChronic (richieste di pull inviate, l’autore non ha ancora risposto).

@Blair Conrad – Buone idee! Ho provato a far funzionare Chronic con IronRuby ma ho avuto qualche problema con le dipendenze – non so che sia ancora pronto.

Ho trovato un progetto su Codeplex ( DateTimeEnglishParser ) che sta tentando di fare la stessa cosa. Non ha ancora anni o tempo, ma è un buon inizio. Ho lavorato un po ‘sul progetto e ho contribuito con una patch per gestire meglio i numeri scritti.

È un problema interessante e mi ha sicuramente aiutato a capire meglio le espressioni regolari, quindi penso che continuerò a lavorarci su.

C’è stato un thread simile in precedenza e ha fornito un collegamento a una libreria su CodeProject che sembra fare ciò che si desidera: http://www.codeproject.com/KB/edit/dateparser.aspx ma sfortunatamente la libreria sembra essere scritta in MFC quindi dovresti creare una DLL e poi chiamarla dal tuo programma .NET.

Palmsey, ho appena avuto lo stesso requisito per cui sono andato avanti e ho scritto un semplice parser. Non è il codice più bello ma gestirà cose come:

“Oggi alle 14:00” “Martedì alle 14:00 – 15 luglio 2010 alle 2:00” “Anno precedente alle 2:00 – Tommorow alle 14:30” “18 luglio 2010 alle 14:45”

Bloccato su codeplex come forse qualcun altro lo troverà utile. Dai un’occhiata a: http://timestamper.codeplex.com/

Ho controllato diversi framework e il ParseDateTime di Python ha funzionato al meglio. Può essere usato da .NET usando IronPython.

Se qualcuno è interessato a un progetto di esempio completo, commenta la risposta e cercherò di crearne una.

MODIFICARE

Come richiesto, ecco un semplice progetto che è ansible utilizzare con la libreria:

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

Prova il seguente caso d’uso, ad esempio:

  • 25 agosto 2008
  • 25 agosto 2008
  • 25 agosto 17:00
  • 17:00 25 agosto
  • sabato prossimo
  • Domani
  • giovedì prossimo alle 16:00
  • alle 16:00
  • EOD
  • domani eod
  • eod martedì
  • EOY
  • EOM
  • in 5 minuti
  • 5 minuti da ora
  • 5 ore prima ora
  • 2 ore prima di mezzogiorno
  • 2 giorni da domani

Non ne sono a conoscenza, ma sembrava un problema interessante, quindi ecco il mio problema (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 

Non è così sofisticato come quelli che già esistono, ma va bene, credo. Potrebbe essere un bel metodo di estensione.

@ Burton: Penso che intendesse l’altro modo, almeno dall’esempio sulla pagina collegata:

  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 

Ho pensato che avrei preso una pugnalata anche fino a quando ho capito! (bella implementazione però)