Pregunta
Estoy buscando para añadir al menos 1 segundo para una fecha y hora para que pueda probar la paginación basada fecha. Estoy esperando obtener una fecha de nuestra respuesta de la API, convertir la cadena de fecha en una fecha, a continuación, convertir eso en milisegundos, añadir un segundo y luego convertir de nuevo en un DateString y usarlo en mi próxima solicitud de API. (Sonido prolijo? Seguro que se siente como que es!)
Estoy teniendo problema y cuando trato de analizar una fecha y hora. El siguiente código está lanzando un error:
def c= new date().parse("yyyy-mm-ddThh:mm:ss",lastDate)
log.info "new formatt"+lastDate
log.info c.timeInMillis
Error: groovy.lang.MissingMethodException: No firma del método: java.util.Date.parse () es aplicable para tipos de argumentos: (java.lang.String, groovy.util.slurpersupport.NodeChildren) valores: [aaaa-mm-ddThh: mm: ss, 2007-01-26T00: 00: 00] soluciones posibles: análisis sintáctico (java.lang.String), de análisis sintáctico (java.lang.String, java.lang.String), wait (), el clon (), cualquier (), uso (java.util.List, groovy.lang.Closure)
¿Algún consejo sobre cómo lograr mi objetivo? O se trata de un enfoque tarado?
Solución
Probablemente el más conciso, solución maravilloso idiomática y sin dependencias:
Date.parse( "yyyy-MM-dd'T'HH:mm:ss", text ).with { new Date( time + 1000) }
Otros consejos
Sonidos como bastante una manera indirecta de la adición de un segundo. ¿Por qué no simplemente:
import groovy.time.TimeCategory
def lastDate = new Date()
use(TimeCategory) {
lastDate = lastDate + 1.second
}
Para más flexible análisis de cadenas fecha, es posible que desee ver en la biblioteca de Java JChronic. Se puede manejar fechas en muchos formatos diferentes y no depender de tener una plantilla exacta como la clase SimpleDateFormat. Aquí hay un ejemplo usando los dos siguientes:
Date.metaClass.'static'.fromString = { str ->
com.mdimension.jchronic.Chronic.parse(str).beginCalendar.time
}
def lastDate = Date.fromString("2007-01-26T00:00:00")
use (TimeCategory) {
100.times {
runTest(lastDate)
lastDate = lastDate + 1.second
}
}
Una solución más genérica de Java es el uso de la biblioteca del Joda Time .
//
// Dependencies
// ============
import org.joda.time.*
import org.joda.time.format.*
@Grapes([
@Grab(group='joda-time', module='joda-time', version='1.6.2')
])
//
// Main program
// ============
DateTimeFormatter psr = ISODateTimeFormat.dateTimeParser()
DateTimeFormatter fmt = ISODateTimeFormat.dateHourMinuteSecond()
DateTime inDate = psr.parseDateTime("2010-11-18T23:23:59")
println fmt.print(inDate.plusSeconds(1))
Puede manejar cualquier formato de fechas de entrada y salida, incluyendo escenarios complejos con zonas horarias en la cadena de fecha, por ejemplo, "2010-11-18T23: 23: 59 + 01: 00"
Un colega ayudado con lo siguiente: -
--import groovy.time.TimeCategory)
def aDate = lastDate.toString()
def newdate = Date.parse("yyyy-MM-dd'T'HH:mm:ss",aDate)
use(TimeCategory){
newdate = newdate+1.second
}
Yo tenía un poco de dificultad añadiendo inicialmente el tiempo - los tipos no estaban jugando muy bien juntos.
Gracias a todos por sus respuestas gente!
Tome un vistazo aquí:
¿Quieres usar algo como:
def c = Calendar.instance
c.add(Calendar.SECOND, 1)
Es necesario inicializar los c
con una fecha que deseas, vistazo al enlace en diferentes posibilidades, pero aquí hay un ejemplo:
c = new GregorianCalendar(2009, Calendar.JULY, 22, 2, 35, 21)