2008-08-22 9 views
26

Est-ce que quelqu'un sait d'un analyseur de date/heure de .NET semblable à Chronic for Ruby (manipule des choses comme "demain" ou "15pm jeudi prochain")?Analyseur de date/heure en langage naturel pour .NET?

Note: J'écris Ruby (ce que je sais sur Chronic) mais ce projet doit utiliser .NET.

+0

Voir la réponse à propos de NChronic http://stackoverflow.com/questions/14583285/clever-way-to-parse-dates-c-sharp/25588407#25588407 –

Répondre

11

Nous avons développé exactement ce que vous recherchez sur un projet interne. Nous envisageons de le rendre public s'il y a un besoin suffisant. Jetez un oeil à ce blog pour plus de détails: http://precisionsoftwaredesign.com/blog.php.

Ne hésitez pas à me contacter si vous êtes intéressé: [email protected]

Cette bibliothèque est maintenant un projet SourceForge. La page est à l'adresse:

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

L'ensemble est dans la section téléchargements, et la source est disponible avec Mercurial.

+0

L'avez-vous rendu public à la fin? –

2

Je ne suis pas au courant d'un, mais il semblait comme un problème cool, donc voici mon grand coup à elle (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 

Il est vraiment pas aussi sophistiqué que ceux qui existent déjà, mais ça fonctionne, je suppose. Pourrait être une bonne méthode d'extension.

+3

ce n'est pas un analyseur du tout. –

+0

analyseur inverse? Encore une bonne chose, peut être utile .. – nawfal

1

@ Burton: Je pense qu'il voulait dire dans l'autre sens, au moins par l'exemple sur la page liée:

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 

Je pensais que je prendrais un coup de poignard à trop jusqu'à ce que je me suis rendu! (belle implémentation cependant)

5

Je ne sais pas, mais il y a un port Java appelé jchronic. Si rien d'autre, il pourrait fournir un bon point de départ pour le vôtre. Ou peut-être pourriez-vous utiliser un traducteur Java vers C# semi-automatique comme Octopus pour vous aider à le traduire. (Ou quelque chose de mieux, si quelqu'un sait quoi que ce soit.)

Bon, une autre avenue possible: pourriez-vous utiliser le code chronique en utilisant IronRuby?

4

@Blair Conrad - Bonnes idées! J'ai essayé de faire fonctionner Chronic sous IronRuby mais j'ai eu quelques problèmes avec les dépendances - je ne sais pas si c'est déjà prêt.

J'ai trouvé un projet sur Codeplex (DateTimeEnglishParser) qui essaie de faire la même chose. Il ne gère pas les années ni le temps, mais c'est un bon début. J'ai un peu travaillé sur le projet et j'ai apporté un correctif pour mieux gérer les chiffres écrits.

C'est un problème intéressant, et il m'a définitivement aidé à mieux comprendre les expressions régulières, donc je pense que je vais continuer à travailler dessus.

3

Il y avait un similar thread plus tôt et il a donné un lien vers une bibliothèque sur CodeProject qui semble faire ce que vous voulez: http://www.codeproject.com/KB/edit/dateparser.aspx mais malheureusement la bibliothèque semble être écrite en MFC donc vous devriez en faire une DLL et puis appelez-le à partir de votre programme .NET.

3

Palmsey, j'ai récemment eu le même besoin, alors je suis allé de l'avant et j'ai écrit un simple analyseur.Son pas le code plus beau mais il traitera des choses comme:

« Aujourd'hui à 14 heures » « mardi à 14 heures - du 15 juillet 2010 à 2 heures » « Année précédente à 2h du matin - Tommorow à 14h30 » « 18 juillet 2010 à 2:45 pm "

Coincé sur codec comme quelqu'un d'autre le trouvera peut-être utile. Check it out: http://timestamper.codeplex.com/

3

J'ai vérifié plusieurs frameworks et le ParseDateTime de Python a fonctionné le mieux. Il peut être utilisé à partir de .NET en utilisant IronPython.

Si quelqu'un est intéressé par un projet d'exemple complet, commentez la réponse et je vais essayer d'en créer un.

EDIT

Comme l'a demandé, voici un projet simple que vous pouvez utiliser avec la bibliothèque:

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

Essayez le cas d'utilisation suivante, par exemple:

  • 25 août 2008
  • 25 août 2 008
  • 25 août 17 heures
  • 17 heures 25 Août
  • samedi prochain
  • demain
  • jeudi prochain à 16 heures
  • à 16 heures
  • EOD
  • demain EOD
  • EOD mardi
  • eoy
  • EOM
  • en 5 minutes
  • 5 minutes à partir de maintenant
  • 5 heures avant maintenant
  • 2 heures avant midi
  • 2 jours à partir de demain
+0

Je suis intéressé! – Dharun

+0

@SwearWord - Là vous allez :) – VitalyB

+0

Merci beaucoup – Dharun

Questions connexes