Domanda

Qualcuno conosce un parser di data/ora .NET simile a Cronica per Ruby (gestisce cose come "domani" o "15:00 giovedì prossimo")?

Nota:Scrivo Ruby (è così che conosco Chronic) ma questo progetto deve utilizzare .NET.

È stato utile?

Soluzione

Abbiamo sviluppato esattamente quello che stai cercando su un progetto interno.Stiamo pensando di renderlo pubblico se ce ne sarà sufficiente bisogno.Dai un'occhiata a questo blog per maggiori dettagli: http://precisionsoftwaredesign.com/blog.php.

Sentiti libero di contattarmi se sei interessato:contact@precisionsoftware.us

Questa libreria è ora un progetto SourceForge.La pagina è a:

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

L'assembly si trova nella sezione download e il sorgente è disponibile con Mercurial.

Altri suggerimenti

Io no, ma c'è una porta Java chiamata jcronico.Se non altro, potrebbe fornire un buon punto di partenza per il tuo.O forse potresti usare un traduttore semiautomatico da Java a C# come Polpo per aiutarlo a tradurlo.(O qualcosa di meglio, se qualcuno sa qualcosa.)

Ok, un'altra strada possibile:potresti usare il codice cronico usando IronRuby?

Esiste un port .NET di Chronic.Vedere https://github.com/robertwilczynski/nChronic.Ne ho creato un fork con alcuni miglioramenti e correzioni di bug, qui: https://github.com/dorony/nChronic (richieste pull inviate, l'autore non ha ancora risposto).

@Blair Conrad - Buone idee!Ho provato a far funzionare Chronic con IronRuby ma ho avuto alcuni problemi con le dipendenze: non so se sia ancora pronto.

Ho trovato un progetto su Codeplex (DateTimeEnglishParser) che sta tentando di fare la stessa cosa.Non gestisce 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 comprendere meglio le espressioni regolari, quindi penso che continuerò a lavorarci.

C'era un filo simile in precedenza e ha fornito un collegamento a una libreria su CodeProject che sembra fare quello che vuoi: http://www.codeproject.com/KB/edit/dateparser.aspx ma sfortunatamente la libreria sembra essere scritta in MFC quindi dovresti crearne una DLL e poi chiamarla dal tuo programma .NET.

Palmsey, ho avuto di recente la stessa esigenza, quindi sono andato avanti e ho scritto un semplice parser.Non è il codice più carino ma gestirà cose come:

"Oggi alle 14:00" "martedì alle 14:00 al 15 luglio 2010 alle 2am" "Anno precedente alle 2 del mattino - Tommorow alle 14:30" "18 luglio 2010 alle 14:45"

Bloccato su codeplex perché forse qualcun altro lo troverà utile.Controlla: http://timestamper.codeplex.com/

Ho controllato diversi framework e Python ParseDateTime ha funzionato al meglio.Può essere utilizzato da .NET utilizzando IronPython.

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

MODIFICARE

Come richiesto, ecco un semplice progetto che puoi 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
  • 25 agosto ore 17.00
  • sabato prossimo
  • Domani
  • giovedì prossimo alle 16:00
  • alle 16:00
  • eod
  • domani eod
  • eod martedì
  • ehi
  • eom
  • in 5 minuti
  • Tra 5 minuti
  • 5 ore prima di adesso
  • 2 ore prima di mezzogiorno
  • 2 giorni da domani

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

In realtà non è così sofisticato come quelli già esistenti, ma immagino che funzioni bene.Potrebbe essere un bel metodo di estensione.

@Burton:Penso che intendesse il contrario, almeno dall'esempio nella 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 ci avrei provato anch'io finché non me ne sono reso conto!(bella implementazione però)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top