string parsing date groovy

groovy replace string



Groovy String hasta la fecha (6)

Buscando en Google formas geniales para "lanzar" una String a una Date , me encontré con este artículo: http://www.goodercode.com/wp/intercept-method-calls-groovy-type-conversion/

El autor usa Groovy metaMethods para permitir extender dinámicamente el comportamiento de cualquier clase asType método asType . Aquí está el código del sitio web.

class Convert { private from private to private Convert(clazz) { from = clazz } static def from(clazz) { new Convert(clazz) } def to(clazz) { to = clazz return this } def using(closure) { def originalAsType = from.metaClass.getMetaMethod(''asType'', [] as Class[]) from.metaClass.asType = { Class clazz -> if( clazz == to ) { closure.setProperty(''value'', delegate) closure(delegate) } else { originalAsType.doMethodInvoke(delegate, clazz) } } } }

Proporcionan una clase Convert que envuelve la complejidad de Groovy, por lo que es trivial agregar conversión personalizada de tipo basado en cualquier tipo a cualquier otro:

Convert.from( String ).to( Date ).using { new java.text.SimpleDateFormat(''MM-dd-yyyy'').parse(value) } def christmas = ''12-25-2010'' as Date

Es una solución conveniente y poderosa, pero no se lo recomendaría a alguien que no esté familiarizado con las ventajas y desventajas de jugar con metaClasses.

Estoy codificando esto con Groovy

Actualmente estoy tratando de convertir una cadena que tengo en una cita sin tener que hacer nada demasiado tedioso.

String theDate = "28/09/2010 16:02:43"; def newdate = new Date().parse("d/M/yyyy H:m:s", theDate)

Salida:

Tue Aug 10 16:02:43 PST 2010

El código anterior funciona bien, sin embargo, cuando mi cadena cambia a algo así como:

String testDate = "Tue Aug 10 16:02:43 PST 2010" def newerdate = new Date().parse("d/M/yyyy H:m:s", testDate)

Me dice que "no hay tal valor para Tue". Traté de arrojar una ''E'' en el análisis de la fecha, pero decía que la fecha no podía ser analizada.

¿Alguien puede explicar cómo debo proceder para analizar el segundo ejemplo?


Creo que la mejor manera fácil en este caso es usar parseToStringDate que es una de las mejoras de Groovy JDK:

Parse a String que coincida con el patrón EEE MMM dd HH: mm: ss zzz yyyy que contenga constantes de configuración regional de EE. UU. Solamente (p. Ej., Sat para sábados). Tal cadena es generada por el método toString de Fecha

Ejemplo:

println (Date.parseToStringDate("Tue Aug 10 16:02:43 PST 2010").format(''MM-dd-yyyy''))​

Espero que esto ayude.


El primer argumento para analizar () es el formato esperado. Tienes que cambiar eso a Date.parse("E MMM dd H:m:sz yyyy", testDate) para que funcione. (Tenga en cuenta que no necesita crear un nuevo objeto Date, es un método estático)

Si no sabes de antemano qué formato, tendrás que buscar una biblioteca de análisis especial para eso. En Ruby hay una biblioteca llamada Chronic , pero no conozco un equivalente de Groovy. Editar : hay un puerto Java de la biblioteca llamado jChronic , es posible que desee verificarlo.


JChronic es tu mejor opción. Aquí hay un ejemplo que agrega un método .fromString() a la clase Date que analiza casi cualquier cosa que pueda arrojarle:

Date.metaClass.''static''.fromString = { str -> com.mdimension.jchronic.Chronic.parse(str).beginCalendar.time }

Puedes llamarlo así:

println Date.fromString("Tue Aug 10 16:02:43 PST 2010") println Date.fromString("july 1, 2012") println Date.fromString("next tuesday")



Date#parse está en desuso. La alternativa es:

java.text.DateFormat#parse

por lo tanto :

new SimpleDateFormat("E MMM dd H:m:s z yyyy", Locale.ARABIC).parse(testDate)

Tenga en cuenta que SimpleDateFormat es una implementación de DateFormat