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
Existe un puerto .NET de Chronic. Ver https://github.com/robertwilczynski/nChronic . Creé una bifurcación con algunas mejoras y correcciones de errores, aquí: https://github.com/dorony/nChronic (solicitudes de extracción enviadas, el autor aún no ha respondido).
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.