zona sistema obtener horaria hora formato fecha cambiar actual .net datetime nlp

sistema - Analizador de fecha/hora en lenguaje natural para.NET?



obtener fecha actual c# (9)

¿Alguien sabe de un analizador de fecha / hora .NET similar a Chronic for Ruby (maneja cosas como "mañana" o "15:00 el jueves siguiente")?

Nota: Escribo Ruby (que es lo que sé sobre Chronic) pero este proyecto debe usar .NET.


@ Burton: Creo que se refería a otro lado, al menos del ejemplo en la página vinculada:

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

¡Pensé que podría intentarlo también hasta que me diera cuenta! (buena implementación, sin embargo)


No, pero hay un puerto de Java llamado jchronic . Si nada más, podría proporcionar un buen punto de partida para usted. O tal vez podrías usar un traductor semiautomático de Java a C # como Octopus para ayudar a traducirlo. (O algo mejor, si alguien sabe de algo).

De acuerdo, otra avenida posible: ¿podrías usar el código crónico usando IronRuby ?


No conozco ninguno, pero sonaba como un problema genial, así que aquí está mi golpe (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

Realmente no es tan sofisticado como los que ya existen, pero funciona bien, supongo. Podría ser un buen método de extensión.


@Blair Conrad - ¡Buenas ideas! Intenté que Chronic funcionara bajo IronRuby, pero tuve algunos problemas con las dependencias. No sé si está listo todavía.

Encontré un proyecto en Codeplex ( DateTimeEnglishParser ) que intenta hacer lo mismo. Todavía no maneja años ni tiempo, pero es un buen comienzo. He trabajado un poco en el proyecto y contribuí con un parche para manejar mejor los números escritos.

Es un problema interesante, y definitivamente me ha ayudado a entender mejor las expresiones regulares, así que creo que seguiré trabajando en ello.


Palmsey, acabo de tener el mismo requerimiento, así que seguí adelante y escribí un analizador simple. No es el código más bonito pero manejará cosas como:

"Hoy a las 2 p.m." "Martes a las 2 p.m. - 15 de julio de 2010 a las 2 a.m." "Año anterior a las 2 a. M. - Tommorow a las 14:30" "18 de julio de 2010 a las 2:45 p.m."

Atascado en Codeplex ya que tal vez alguien más lo encuentre útil. Échale un vistazo: http://timestamper.codeplex.com/


Desarrollamos exactamente lo que está buscando en un proyecto interno. Estamos pensando en hacer esto público si hay suficiente necesidad de hacerlo. Eche un vistazo a este blog para más detalles: http://precisionsoftwaredesign.com/blog.php .

No dude en ponerse en contacto conmigo si está interesado: [email protected]

Esta biblioteca es ahora un proyecto de SourceForge. La página está en:

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

El ensamblaje está en la sección de descargas y la fuente está disponible con Mercurial.


Revisé varios frameworks y el ParseDateTime de Python funcionó mejor. Se puede usar desde .NET usando IronPython.

Si alguien está interesado en un proyecto de muestra completo, comente la respuesta e intentaré crear uno.

EDITAR

Como se solicitó, aquí hay un proyecto simple que puede usar con la biblioteca:

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

Pruebe el siguiente caso de uso, por ejemplo:

  • 25 de agosto de 2008
  • 25 de agosto de 2008
  • 25 de agosto a las 17:00
  • 5 p.m. 25 de agosto
  • el próximo sábado
  • mañana
  • el próximo jueves a las 4 p.m.
  • a las 4 pm
  • eod
  • mañana eod
  • eo martes
  • eoy
  • eom
  • en 5 minutos
  • 5 minutos a partir de ahora
  • 5 horas antes de ahora
  • 2 horas antes del mediodía
  • 2 días desde mañana


Hubo un hilo similar anteriormente y dio un enlace a una biblioteca en CodeProject que parece hacer lo que desea: http://www.codeproject.com/KB/edit/dateparser.aspx pero desafortunadamente la biblioteca parece estar escrita en MFC, por lo que tendría que crear una DLL y luego llamarlo desde su programa .NET.