es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No hay firma de método: java.util.Date.minus() es aplicable para los tipos de argumento: (Integer)?

Estoy en el proceso de actualizar grails 2.2 a grails 4.0.10.

En grails 2.2, que utilizaba Java 7, esto solía funcionar:

def eanalytics = EventAnalytics.createCriteria().get(){
    eq('event', raceGroup)
    lt('dateCreated', timeService.now())
    gt('dateCreated', timeService.now() - 1)
}

Ahora, en grails 4 y Java 8, estoy obteniendo esta excepción:

Caused by: groovy.lang.MissingMethodException: No hay una firma de método aplicable para java.util.Date.minus() con argumentos de tipo: (Integer) valores: [1]
Posibles soluciones: encontrar(), encontrar(groovy.lang.Closure), es(java.lang.Object), cualquier(), imprimir(java.io.PrintWriter), usar([Ljava.lang.Objec

Parece que no puedo obtener una nueva fecha simplemente restando el número de días a la fecha en Java 8. ¿Cuál es el código equivalente para hacer esto? Gracias por la ayuda.

timeservice.now es:

def now(){
    def now = new Date()
    return now
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    En Java 8, la clase java.util.Date no tiene un método minus() que acepte un entero. En su lugar, puedes usar la clase java.time.LocalDate, que fue introducida para reemplazar la antigua clase Date.

    Para crear un nuevo objeto LocalDate que sea un número especificado de días antes de la fecha actual, puedes usar el método minusDays(). Aquí tienes un ejemplo:

    def ahora = LocalDate.now()
    def ayer = ahora.minusDays(1)
    

    En tu código, puedes reemplazar la línea gt('dateCreated', timeService.now() - 1) con:

    gt('dateCreated', timeService.now().minusDays(1).toDate())
    

    Esto creará un nuevo objeto LocalDate que representa ayer, y luego lo convertirá de nuevo a un objeto java.util.Date (que es necesario para la compatibilidad con tu código existente).

Comments are closed.