¿Alguien sabe una manera simple de usar el calendario Java para restar X días de una fecha?
No he podido encontrar ninguna función que me permita restar directamente X días de una fecha en Java. ¿Alguien puede señalarme en la dirección correcta?
java
calendar
subtraction
fmsf
fuente
fuente
java.util.Calendar
ahora son heredadas , suplantadas por las clases java.time . Ver Tutorial de Oracle .Respuestas:
Tomado de los documentos aquí :
fuente
Calendar.DAY_OF_MONTH
en este caso ya que no manejará el rollo entre meses como le gustaría. Usar en suCalendar.DAY_OF_YEAR
lugarPodrías usar el
add
método y pasarle un número negativo. Sin embargo, también podría escribir un método más simple que no use laCalendar
clase como el siguienteEsto obtiene el valor de fecha y hora de la fecha (milisegundos desde la época) y agrega la cantidad adecuada de milisegundos. Podría pasar un número entero negativo para el parámetro días para restar. Esto sería más simple que la solución de calendario "adecuada":
Tenga en cuenta que ambas soluciones cambian el
Date
objeto pasado como parámetro en lugar de devolver uno completamente nuevoDate
. Cualquiera de las funciones se puede cambiar fácilmente para hacerlo de la otra manera si se desea.fuente
java.util.Calendar
ahora son heredadas , suplantadas por las clases java.time . Ver Tutorial de Oracle .La respuesta de Anson funcionará bien para el caso simple, pero si va a hacer cálculos de fechas más complejos, le recomiendo que revise Joda Time . Hará tu vida mucho más fácil.
FYI en Joda Time que podrías hacer
fuente
tl; dr
Es mejor especificar la zona horaria.
Detalles
Las antiguas clases de fecha y hora incluidas con las primeras versiones de Java, como
java.util.Date
/.Calendar
, han demostrado ser problemáticas, confusas y defectuosas. Evítales.java.time
Java 8 y posterior suplanta esas clases antiguas con el nuevo marco java.time. Ver tutorial . Definido por JSR 310 , inspirado en Joda-Time , y ampliado por el proyecto ThreeTen-Extra . El proyecto ThreeTen-Backport transfiere las clases a Java 6 y 7; el proyecto ThreeTenABP para Android.
La pregunta es vaga, no está clara si solicita una fecha solamente o una fecha y hora.
LocalDate
Para una fecha solamente, sin hora del día, use la
LocalDate
clase. Tenga en cuenta que una zona horaria es crucial para determinar una fecha como "hoy".ZonedDateTime
Si se refería a una fecha y hora, use la
Instant
clase para obtener un momento en la línea de tiempo en UTC . Desde allí, ajústese a una zona horaria para obtener unZonedDateTime
objeto.Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cuerdas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
editar: al analizador no parece gustarle el enlace al Javadoc, así que aquí está en texto sin formato:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
fuente
En lugar de escribir el mío
addDays
como lo sugiere Eli, preferiría usarloDateUtils
desde Apache . Es útil especialmente cuando tienes que usarlo en múltiples lugares en tu proyecto.La API dice:
addDays(Date date, int amount)
Agrega una cantidad de días a una fecha que devuelve un nuevo objeto.
Tenga en cuenta que devuelve un nuevo
Date
objeto y no realiza cambios en el anterior.fuente
Se puede hacer fácilmente de la siguiente manera
fuente
LocalDate
es mucho más simple y más apropiado.Alguien recomendó Joda Time, así que he estado usando esta clase CalendarDate http://calendardate.sourceforge.net
Es un proyecto un tanto competitivo para Joda Time, pero mucho más básico con solo 2 clases. Es muy útil y funcionó muy bien para lo que necesitaba, ya que no quería usar un paquete más grande que mi proyecto. A diferencia de las contrapartes de Java, su unidad más pequeña es el día, por lo que es realmente una fecha (no tenerla en milisegundos o algo así). Una vez que cree la fecha, todo lo que debe hacer para restar es algo como myDay.addDays (-5) para retroceder 5 días. Puedes usarlo para encontrar el día de la semana y cosas así. Otro ejemplo:
Y:
fuente
Creo que se puede lograr una forma limpia y agradable de restar o agregar cualquier unidad de tiempo (meses, días, horas, minutos, segundos, ...) usando la clase java.time.Instant .
Ejemplo para restar 5 días de la hora actual y obtener el resultado como Fecha:
Otro ejemplo para restar 1 hora y agregar 15 minutos:
Si necesita más precisión, la instancia mide hasta nanosegundos. Métodos que manipulan la parte de nanosegundos:
Además, tenga en cuenta que esa Fecha no es tan precisa como Instant.
fuente
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
La segunda solución de Eli Courtwright está mal, debería ser:
fuente
addDays
; Su solución es correcta. Si desea restar días de la fecha, pasa un valor negativo paradays
.