Domanda

Questa domanda è l'altro lato della domanda che chiede: "Come calcolo il tempo relativo?".

Dato un input umano per un tempo relativo, come puoi analizzarlo?Per impostazione predefinita, dovresti compensare da DateTime.Now(), ma potrebbe facoltativamente compensare da un altro DateTime.

(Preferisco risposte in C#)

Ingresso di esempio:

  • "in 20 minuti"
  • "5 ore fa"
  • "3 ore e 2 minuti"
  • "la prossima settimana"

Modificare: Supponiamo di poter definire alcuni limiti sull'input.Questo tipo di codice sarebbe una cosa utile da avere sul web.

È stato utile?

Soluzione

Si tratta della creazione di un DSL (linguaggio specifico del dominio) per la gestione dei dati.Non so se qualcuno ne ha fatto uno per .NET ma la costruzione di un DSL è abbastanza semplice:

  1. Definisci con precisione la lingua, quali moduli di input accetterai e cosa farai con le ambiguità
  2. Costruisci la grammatica della lingua
  3. Costruisci la macchina a stati finiti che analizza il tuo linguaggio in un AST utilizzabile

Puoi fare tutto questo da solo (con l'aiuto di il Libro del Drago, ad esempio) o con l'aiuto di strumenti adatti, come mostrato in questo collegamento.

Solo riflettendo attentamente sulle possibilità hai buone possibilità, con l'aiuto di buoni esempi di interfaccia utente, di coprire più della metà degli input effettivi che la tua applicazione riceverà.Se miri ad accettare tutto ciò che un essere umano potrebbe digitare, puoi registrare l'input determinato come ambiguo e quindi aggiungerlo alla grammatica, ogni volta che può essere interpretato, poiché ci sono cose che saranno intrinsecamente ambigue.

Altri suggerimenti

Una ricerca su Google rivela il parsedatetime libreria (associata al Progetto Chandler), che è progettato per fare esattamente questo.È open source (licenza Apache) e scritto in Python.Sembra essere piuttosto sofisticato - dalla homepage:

ParseDateTime è in grado di analizzare, ad esempio, quanto segue:

* Aug 25 5pm
* 5pm August 25
* next saturday
...
* tomorrow
* next thursday at 4pm
* at 4pm
* eod
* in 5 minutes
* 5 minutes from now
* 5 hours before now
* 2 days from tomorrow

Dato che è implementato in puro Python e non utilizza nulla di sofisticato, ci sono buone probabilità che sia compatibile IronPython, quindi potresti usarlo con .net.Se vuoi specificamente una soluzione C#, potresti scrivere qualcosa in base agli algoritmi che usano...

Inoltre viene fornito con un sacco di test unitari.

Questo probabilmente non è poi così utile dato che stai parlando di C# ma poiché nessuno lo ha ancora menzionato puoi provare a dare un'occhiata all'eccellente e assolutamente folle nativo di php strtotime funzione

Quelli di Ruby hanno tentato di risolvere questo problema con un parser chiamato Cronico.

Recentemente ho guardato una presentazione video informativa su come l'autore ha risolto questo problema.

Questo: http://www.codeproject.com/KB/edit/dateparser.aspxÈ abbastanza vicino a ciò che stai cercando di realizzare.Non è la soluzione più elegante, ma sicuramente potrebbe farti risparmiare un po’ di lavoro.

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