¿Cómo restar X días de una fecha usando el calendario Java?

Resuelto fmsf asked hace 15 años • 11 respuestas

¿Alguien conoce una forma sencilla de utilizar 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 a una fecha en Java. ¿Alguien puede indicarme la dirección correcta?

fmsf avatar Oct 17 '08 21:10 fmsf
Aceptado

Tomado de los documentos aquí :

Agrega o resta la cantidad de tiempo especificada al campo de calendario dado, según las reglas del calendario. Por ejemplo, para restar 5 días a la hora actual del calendario, puedes lograrlo llamando a:

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).
Anson Smith avatar Oct 17 '2008 14:10 Anson Smith

Podrías usar el addmétodo y pasarle un número negativo. Sin embargo, también podría escribir un método más simple que no use la Calendarclase como el siguiente

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

Esto obtiene el valor de la marca de tiempo de la fecha (milisegundos desde la época) y agrega la cantidad adecuada de milisegundos. Podrías pasar un número entero negativo para que el parámetro de días realice la resta. Esto sería más sencillo que la solución de calendario "adecuada":

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

Tenga en cuenta que ambas soluciones cambian el Dateobjeto pasado como parámetro en lugar de devolver un objeto completamente nuevo Date. Cualquiera de las funciones se puede cambiar fácilmente para hacerlo al revés si se desea.

Eli Courtwright avatar Oct 17 '2008 14:10 Eli Courtwright

La respuesta de Anson funcionará bien para el caso simple, pero si va a realizar cálculos de fechas más complejos, le recomiendo que consulte Joda Time . Te hará la vida mucho más fácil.

Para tu información, en Joda Time podrías hacer

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
Mike Deck avatar Oct 17 '2008 14:10 Mike Deck

tl; dr

LocalDate.now().minusDays( 10 )

Es mejor especificar la zona horaria.

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

Detalles

Las antiguas clases de fecha y hora incluidas en las primeras versiones de Java, como java.util.Date/ .Calendar, han demostrado ser problemáticas, confusas y defectuosas. Evítales.

java.tiempo

Java 8 y posteriores reemplazan 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 traslada las clases a Java 6 y 7; el proyecto ThreeTenABP para Android.

La pregunta es vaga y no está claro si solicita solo una fecha o una fecha y hora.

LocalDate

Para una fecha únicamente, sin hora del día, utilice la LocalDateclase. Tenga en cuenta que una zona horaria es crucial para determinar una fecha como "hoy".

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

Si te refieres a una fecha y hora, usa la Instantclase para obtener un momento en la línea de tiempo en UTC . A partir de ahí, ajústese a una zona horaria para obtener un ZonedDateTimeobjeto.

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

Tabla de tipos de fecha y hora en Java, tanto moderna como heredada.


Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases reemplazan a las antiguas y problemáticas clases de fecha y hora heredadas , como java.util.Date, Calendary SimpleDateFormat.

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 cadenas, no hay necesidad de java.sql.*clases.

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 y posteriores
    • Incorporado.
    • Parte de la API de Java estándar con una implementación incluida.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP… .

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como , Interval, y más .YearWeekYearQuarter

Basil Bourque avatar Nov 04 '2015 19:11 Basil Bourque
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

Verjava.util.Calendar#add(int,int)

matt b avatar Oct 17 '2008 14:10 matt b