Pregunta

¿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?

¿Fue útil?

Solución

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 de la hora actual del calendario, puede lograrlo llamando:

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).

Otros consejos

Podrí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 utilice el Calendar clase como la 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 Date objeto 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.

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 consulte Joda Time . Le hará la vida mucho más fácil.

FYI en Joda Time que podrías hacer

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);

tl; dr

LocalDate.now().minusDays( 10 )

Mejor especificar zona horaria.

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

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ítalos.

java.time

Java 8 y posterior suplanta esas clases antiguas con el nuevo marco java.time. Consulte Tutorial . Definido por JSR 310 , inspirado en Joda-Time , y extendido por Proyecto ThreeTen-Extra . El proyecto ThreeTen-Backport transfiere las clases a Java 6 & Amp; 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 el ZonedDateTime clase. Tenga en cuenta que una zona horaria es crucial para determinar una fecha como & Quot; today & Quot ;.

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

Instant

Si se refería a una fecha y hora, utilice Calendar para obtener un momento en la línea de tiempo en UTC . Desde allí, ajústese a una zona horaria para obtener un < => objeto.

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 modernos como heredados.


Acerca de java.time

El java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las viejas y problemáticas legacy clases de fecha y hora como SimpleDateFormat , java.sql.* , & amp; Interval .

El Joda-Time , ahora en < a href = "https://en.wikipedia.org/wiki/Maintenance_mode" rel = "nofollow noreferrer"> modo de mantenimiento , aconseja la migración al clases java.time .

Para obtener más información, consulte el Oracle Tutorial . 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 YearWeek 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. Puede encontrar algunas clases útiles aquí, como YearQuarter , <=> , <=> , y más .

int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

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)

En lugar de escribir el mío addDays como lo sugirió Eli, preferiría usar DateUtils de apache.Es útil especialmente cuando tienes que usarlo en varios lugares de tu proyecto.

La API dice:

addDays(Date date, int amount)

Agrega una cantidad de días a una fecha de devolución de un nuevo objeto.

Tenga en cuenta que devuelve un nuevo Date objeto y no realiza cambios sobre el anterior.

Alguien recomendó Joda Time, así que he estado usando esta CalendarDate clase http: // calendardate. sourceforge.net

Es un proyecto algo 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:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

Y:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}

Se puede hacer fácilmente con lo siguiente

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

La segunda solución de Eli Courtwright está mal, debería ser:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top