Question

Cette question est l'autre côté de la question : "Comment calculer le temps relatif ?".

Étant donné une contribution humaine pendant un temps relatif, comment pouvez-vous l'analyser ?Par défaut, vous compenseriez à partir de DateTime.Now(), mais pourrait éventuellement compenser un autre DateTime.

(Préférez les réponses en C#)

Exemple d'entrée :

  • "Dans 20 Minutes"
  • "il y a 5 heures"
  • "3h 2min"
  • "la semaine prochaine"

Modifier: Supposons que nous puissions définir certaines limites sur l'entrée.Ce type de code serait utile à diffuser sur le Web.

Était-ce utile?

La solution

Cela consiste à créer un DSL (langage spécifique au domaine) pour la gestion des dates.Je ne sais pas si quelqu'un en a fait un pour .NET mais la construction d'un DSL est assez simple :

  1. Définissez précisément le langage, les formulaires de saisie que vous accepterez et que ferez-vous des ambiguïtés
  2. Construire la grammaire de la langue
  3. Construisez la machine à états finis qui analyse votre langage en un AST exploitable

Vous pouvez faire tout cela vous-même (avec l'aide de le livre du dragon, par exemple) ou à l'aide d'outils à cet effet, comme indiqué dans ce lien.

En réfléchissant attentivement aux possibilités, vous avez de bonnes chances, avec l'aide de bons exemples d'interface utilisateur, de couvrir plus de la moitié des entrées réelles que votre application recevra.Si vous souhaitez accepter tout ce qu'un humain pourrait taper, vous pouvez enregistrer les entrées jugées ambiguës, puis les ajouter à la grammaire, chaque fois qu'elles peuvent être interprétées, car certaines choses seront intrinsèquement ambiguës.

Autres conseils

Une recherche Google révèle le analyser la date et l'heure bibliothèque (associée à la Projet Chandler), qui est conçu pour faire exactement cela.Il est open source (licence Apache) et écrit en Python.Cela semble assez sophistiqué – d'après la page d'accueil :

ParsedateTime est capable d'analyser, par exemple, ce qui suit:

* 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

Puisqu'il est implémenté en Python pur et n'utilise rien d'extraordinaire, il y a de fortes chances qu'il soit compatible avec FerPython, vous pouvez donc l'utiliser avec .net.Si vous souhaitez spécifiquement une solution C#, vous pouvez écrire quelque chose basé sur les algorithmes qu'ils utilisent...

Il est également livré avec tout un tas de tests unitaires.

Ce n'est probablement pas très utile puisque vous parlez de C#, mais comme personne ne l'a encore mentionné, vous pouvez essayer de jeter un œil à l'excellent et complètement fou natif de PHP. heure strtotime fonction

Les utilisateurs de Ruby ont tenté de résoudre ce problème avec un analyseur appelé Chronique.

J'ai récemment regardé une présentation vidéo informative sur la façon dont l'auteur a résolu ce problème.

Ce: http://www.codeproject.com/KB/edit/dateparser.aspxEst assez proche de ce que vous essayez d’accomplir.Ce n’est pas la solution la plus élégante, mais elle pourrait certainement vous épargner du travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top