Question

Quelqu'un connaît-il un analyseur de date/heure .NET similaire à Chronique pour Ruby (gère des trucs comme "demain" ou "15h jeudi prochain") ?

Note:J'écris Ruby (c'est ainsi que je connais Chronic) mais ce projet doit utiliser .NET.

Était-ce utile?

La solution

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

N'hésitez pas à me contacter si vous êtes intéressé :contact@precisionsoftware.us

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

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

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

Autres conseils

Non, mais il existe un port Java appelé jchronique.À tout le moins, cela pourrait constituer un bon point de départ pour le vôtre.Ou peut-être pourriez-vous utiliser un traducteur semi-automatique Java vers C# comme Pieuvre pour aider à le traduire.(Ou quelque chose de mieux, si quelqu'un sait quelque chose.)

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

Un port .NET de Chronic existe.Voir https://github.com/robertwilczynski/nChronic.J'en ai créé un fork avec quelques améliorations et corrections de bugs, ici : https://github.com/dorony/nChronic (envoyé des pull request, l'auteur n'a toujours pas répondu).

@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 s'il est encore prêt.

J'ai trouvé un projet sur Codeplex (DateTimeAnglaisParser) qui tente de faire la même chose.Cela ne gère pas encore les années ni le temps, mais c'est un bon début.J'ai un peu travaillé sur le projet et contribué à un patch pour mieux gérer les nombres écrits.

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

Il y avait un fil similaire 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, vous devrez donc en créer une DLL, puis l'appeler depuis votre programme .NET.

Palmsey, j'ai récemment eu la même exigence, alors je suis allé de l'avant et j'ai écrit un analyseur simple.Ce n'est pas le code le plus sympa mais il gérera des choses comme :

"Aujourd'hui à 14h" "Mardi de 14h - 15 juillet 2010 à 2h du matin" "L'année précédente à 2h - Tommorow à 14h30" "18 juillet 2010 à 14h45"

Collez-le sur Codeplex car peut-être que quelqu'un d'autre le trouvera utile.Vérifiez-le: http://timestamper.codeplex.com/

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

Si quelqu'un est intéressé par un exemple de projet complet, commentez la réponse et j'essaierai d'en créer un.

MODIFIER

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

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

Essayez par exemple le cas d'utilisation suivant :

  • 25 août 2008
  • 25 août 2008
  • 25 août 17h
  • 17h le 25 août
  • samedi prochain
  • demain
  • jeudi prochain à 16h
  • à 16 heures
  • bonne nouvelle
  • demain midi
  • mardi midi
  • eoy
  • eom
  • dans 5 minutes
  • dans 5 minutes
  • 5 heures avant maintenant
  • 2 heures avant midi
  • 2 jours à partir de demain

Je n'en connais pas, mais cela semblait être un problème intéressant, alors voici ma solution (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

Ce n'est vraiment pas aussi sophistiqué que ceux qui existent déjà, mais ça fonctionne bien, je suppose.Cela pourrait être une bonne méthode d’extension.

@Burton :Je pense qu'il voulait dire le contraire, du moins d'après l'exemple de 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

J'ai pensé que j'essaierais aussi jusqu'à ce que je m'en rende compte !(belle mise en œuvre cependant)

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