ejemplo - java.util.Fecha: Hace siete días
jframe (11)
¿Hay alguna razón por la que no pueda realizar un cálculo en su bean de respaldo? Luego envíelo a su informe como un parámetro.
Tengo un informe creado en Jasper Reports que SOLO reconoce java.util.Date''s (no Calendar o Gregorian, etc.).
¿Hay alguna forma de crear una fecha 7 días antes de la fecha actual?
Idealmente, se vería algo como esto:
new Date(New Date() - 7)
ACTUALIZACIÓN: No puedo enfatizar esto lo suficiente: JasperReports NO RECONOCE los objetos de Java Calendar.
Desde exactamente ahora:
long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))
Desde Date date
arbitraria Date date
:
new Date(date.getTime() - (7 * DAY_IN_MS))
Edición: como se señaló en las otras respuestas, no tiene en cuenta el horario de verano, si ese es un factor.
Solo para aclarar esa limitación de la que estaba hablando:
Para las personas afectadas por el horario de verano , si por 7 days earlier
, quiere decir que si es ahora a las 12pm noon on 14 Mar 2010
, quiere que el cálculo de 7 days earlier
dé como resultado las 12pm on 7 Mar 2010
, entonces tenga cuidado.
Esta solución encuentra la fecha / hora exactamente 24 horas * 7 días = 168 horas antes.
Sin embargo, algunas personas se sorprenden cuando esta solución encuentra que, por ejemplo, (14 Mar 2010 1:00pm) - 7 * DAY_IN_MS
puede devolver un resultado en (7 Mar 2010 12:00pm)
(14 Mar 2010 1:00pm) - 7 * DAY_IN_MS
(7 Mar 2010 12:00pm)
Donde se encuentra la hora del reloj de pared en su zona horaria. No es lo mismo entre las 2 fechas / horas ( 1pm
vs 12pm
). Esto se debe a que el horario de verano que comienza o finaliza esa noche y al "tiempo de reloj de pared" pierde o gana una hora.
Si el horario de verano no es un factor para usted o si realmente desea (168 hours)
exactamente (independientemente del cambio en la hora del reloj de pared), entonces esta solución funciona bien.
De lo contrario, es posible que deba compensar cuando sus 7 days earlier
no significan exactamente 168 horas (debido a que el horario de verano comienza o finaliza dentro de ese plazo).
Lo estoy haciendo de esta manera:
Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH), -7);
No estoy seguro de cuándo los agregaron, pero JasperReports tiene su propio conjunto de "funciones" que pueden manipular las fechas. Aquí hay un ejemplo que no he probado a fondo:
DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()) - 7)
Eso construye un java.util.Date
con la fecha establecida en 7 días a partir de hoy. Si desea usar una fecha "ancla" diferente, simplemente reemplace TODAY()
con la fecha que desee usar.
Prueba esto:
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();
Puedes probar esto,
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
System.out.println(new java.sql.Date(c.getTimeInMillis()));
Un "día" determinante requiere una zona horaria. Una zona horaria define cuándo comienza un "día". Una zona horaria incluye reglas para manejar el horario de verano y otras anomalías. No hay magia para hacer que las zonas horarias sean irrelevantes. Si ignora el problema, se aplicará la zona horaria predeterminada de la JVM. Esto tiende a llevar a confusión y dolor.
Evitar java.util.Date
Las clases java.util.Date y .Calendar son notoriamente problemáticas. Evítales. Son tan malos que Sun / Oracle acordaron suplantarlos con el nuevo paquete java.time en Java 8. Usa eso o Joda-Time .
Tiempo de joda
Código de ejemplo en Joda-Time 2.3.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Specify or else the JVM''s default will apply.
DateTime dateTime = new DateTime( new java.util.Date(), timeZone ); // Simulate passing a Date.
DateTime weekAgo = dateTime.minusDays( 7 );
Primer momento del dia
O bien, es posible que desee ajustar la hora del día al primer momento del día para capturar el tiempo de un día completo. Llame al método withTimeAtStartOfDay
. Tenga en cuenta que esto suele ser 00:00:00
pero no siempre.
Evite los métodos y clases de "medianoche" en Joda-Time. Se basan en un concepto defectuoso y ahora están en desuso.
DateTime dateTimeStart = new DateTime( new java.util.Date(), timeZone ).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00".
DateTime weekAgo = dateTime.minusDays( 7 ).withTimeAtStartOfDay();
Convertir a / desde juDate
Como se vio anteriormente, para convertir de java.util.Date a Joda-Time simplemente pase el objeto Date al constructor de DateTime. Comprenda que un dato no tiene una zona horaria , un DateTime sí lo tiene. Así que asigne la zona horaria deseada / apropiada para decidir qué son los "días" y cuándo comienzan.
Para ir al otro lado, DateTime to juDate, simplemente llame al método toDate
.
java.util.Date date = dateTime.toDate();
Use la facilidad de Calendar para crear nuevos objetos de fecha usando getTime()
:
import java.util.GregorianCalendar;
import java.util.Date;
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, -7);
Date sevenDaysAgo = cal.getTime();
Ya que nadie ha mencionado TimeUnit
todavía:
new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
tratar
Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));
Otra forma es usar el Calendario, pero no me gusta usarlo yo mismo.
Debido a la discusión acalorada:
Es posible que la pregunta no tenga una respuesta adecuada sin una zona horaria designada.
debajo hay un código para trabajar con la zona horaria predeterminada (y, por tanto, en desuso) que tiene en cuenta el horario de verano predeterminado.
Date date= new Date();
date.setDate(date.getDate()-7);//date works as calendar w/ negatives
Si bien la solución funciona, es exactamente tan falsa como en términos de asumir la zona horaria.
new Date(System.currentTimeMillis() - 10080*60000);//a week has 10080 minutes
Por favor, no vote por la respuesta.