2008-08-22 21 views
26

Czy ktoś zna parser daty/czasu .NET podobny do Chronic for Ruby (obsługuje rzeczy takie jak "jutro" lub "godzina piętnasta w następny czwartek")?Parser daty i czasu w języku naturalnym dla .NET?

Uwaga: Piszę Ruby (w ten sposób wiem o Chronic), ale ten projekt musi korzystać z .NET.

+0

Zobacz odpowiedź na temat NChronic http://stackoverflow.com/questions/14583285/clever-way-to-parse-dates-c-sharp/25588407#25588407 –

Odpowiedz

11

Opracowaliśmy dokładnie to, czego szukasz w wewnętrznym projekcie. Zastanawiamy się nad upublicznieniem tego, jeśli jest na to wystarczająca potrzeba. Więcej informacji na ten blog: http://precisionsoftwaredesign.com/blog.php.

Zapraszam do kontaktu ze mną, jeśli jesteś zainteresowany: [email protected]

Biblioteka ta jest obecnie projekt SourceForge. Na stronie znajduje się pod adresem:

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

Zespół jest w dziale download, a źródłem jest dostępna z Mercurial.

+0

Czy w końcu ją upubliczniłeś? –

2

nie jestem świadomy jednego, ale brzmiało to chłodnym problemu, więc oto moja walnięcie w nim (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 

To naprawdę nie jest tak skomplikowane, jak te, które już istnieją, ale chyba wszystko działa dobrze. To może być dobra metoda rozszerzenia.

+3

to nie jest w ogóle parser. –

+0

odwróć parser? Wciąż dobra rzecz, może być przydatna. – nawfal

1

@ Burton: Myślę, że miał na myśli w inną stronę, przynajmniej z przykładu na połączonej stronie:

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 

Myślałem wziąłbym ukłucie w nim zbyt dopóki nie zrozumiał! (miła implementacja)

5

Nie, ale istnieje port Java o nazwie jchronic. Jeśli nic więcej, to może stanowić dobry punkt wyjścia dla siebie. A może możesz użyć półautomatycznego translatora języka Java na język C#, takiego jak Octopus, aby pomóc w tłumaczeniu. (Albo coś lepszego, jeśli ktoś wie o czymkolwiek).

Dobra, inna możliwa droga: czy można użyć chronicznego kodu przy użyciu IronRuby?

4

@Blair Conrad - Dobre pomysły! Próbowałem uzyskać przewlekłą pracę pod IronRuby, ale miałem pewne problemy z zależnościami - nie wiem, czy są jeszcze gotowe.

Znalazłem projekt na Codeplex (DateTimeEnglishParser), który próbuje zrobić to samo. Nie zajmuje się jeszcze latami ani czasem, ale to dobry początek. Pracowałem trochę nad projektem i dodałem łatkę, która lepiej radzi sobie z pisanymi liczbami.

To interesujący problem i zdecydowanie pomógł mi lepiej zrozumieć wyrażenia regularne, więc myślę, że będę nad tym pracował.

3

Palmsey, Niedawno miałem to samo wymaganie, więc napisałem prosty parser.Nie jest to najładniejszy kod, ale będzie obsługiwać takie rzeczy jak:

„Dzisiaj o 2pm” „we wtorek o 2pm - 15 lipca 2010 roku o godzinie 2 nad ranem” „Poprzedni rok o 2 nad ranem - Jutro o 14:30” „18 lipca 2010 o 14:45 "

Utknąłem na codepleksie, ponieważ być może ktoś inny uzna to za przydatne. Sprawdź to: http://timestamper.codeplex.com/

3

Sprawdziłem kilka frameworków, a Python ParseDateTime działał najlepiej. Może być używany z .NET przy użyciu IronPython.

Jeśli ktoś jest zainteresowany pełnym projektem próbki, skomentuj odpowiedź, a spróbuję ją utworzyć.

EDIT

Zgodnie z wnioskiem, o to prosty projekt, który można skorzystać z biblioteki:

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

Spróbuj następujący przypadek użycia, na przykład:

  • 25 sierpnia 2008
  • 25 sierpnia 2 008
  • 25 sierpnia godzina siedemnasta
  • godzina siedemnasta 25 sierpnia
  • najbliższą sobotę
  • jutro
  • następny czwartek o 4pm
  • na 4pm
  • EOD
  • jutro EOD
  • EOD wtorek
  • eoy
  • MOW
  • w 5 minut
  • 5 minut od teraz
  • 5 godzin przedtem istnieje
  • 2 godziny przed południem
  • 2 dni od jutra
+0

Jestem zainteresowany! – Dharun

+0

@SwearWord - Proszę bardzo :) – VitalyB

+0

Dziękuję bardzo – Dharun