Cómo agregar minutos a mi fecha

110

Tengo este objeto de fecha:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Date d1 = df.parse(interviewList.get(37).getTime());

el valor de d1 es Fri Jan 07 17:40:00 PKT 2011

Ahora estoy tratando de agregar 10 minutos a la fecha anterior.

Calendar cal = Calendar.getInstance();
cal.setTime(d1);
cal.add(Calendar.MINUTE, 10);
String newTime = df.format(cal.getTime());

Valor de los newTimecambios, 2011-50-07 17:50 pero debería serlo 07-01-2011 17:50.

Agrega minutos correctamente pero también cambia de mes, ¡no sé por qué!

junaidp
fuente

Respuestas:

193

El problema para ti es que estás usando mm. Deberías usar MM. MMes por mes y mmes por minutos. Prueba conyyyy-MM-dd HH:mm

Otro enfoque:

Puede ser tan simple como esto (otra opción es usar joda-time )

static final long ONE_MINUTE_IN_MILLIS=60000;//millisecs

Calendar date = Calendar.getInstance();
long t= date.getTimeInMillis();
Date afterAddingTenMins=new Date(t + (10 * ONE_MINUTE_IN_MILLIS));
Aravind Yarram
fuente
gracias, intenté esto, la fecha viene correctamente, pero cuando trato de cambiarla como cadena, me da el mismo resultado incorrecto String newTime = df.format (afterAddingTenMins); me da 2011-50-07 17:50, tengo que convertirlo en String, cualquier sugerencia
junaidp
1
@junaidp, ¿usó el último fragmento de código, pero ignoró la primera parte de la solución?
Carl
57

puede usar la clase DateUtils en el paquete org.apache.commons.lang3.time

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute
Alireza Alallah
fuente
1
Para las personas que se ocupan de versiones anteriores de DateUtils, está presente en el paquete ->org.apache.commons.lang.time.DateUtils
realPK
32

Método de conveniencia para implementar la respuesta de @ Pangea:

/*
*  Convenience method to add a specified number of minutes to a Date object
*  From: http://stackoverflow.com/questions/9043981/how-to-add-minutes-to-my-date
*  @param  minutes  The number of minutes to add
*  @param  beforeTime  The time that will have minutes added to it
*  @return  A date object with the specified number of minutes added to it 
*/
private static Date addMinutesToDate(int minutes, Date beforeTime){
    final long ONE_MINUTE_IN_MILLIS = 60000;//millisecs

    long curTimeInMs = beforeTime.getTime();
    Date afterAddingMins = new Date(curTimeInMs + (minutes * ONE_MINUTE_IN_MILLIS));
    return afterAddingMins;
}
jeznag
fuente
26

Para evitar cualquier dependencia, puede usar java.util.Calendar de la siguiente manera:

    Calendar now = Calendar.getInstance();
    now.add(Calendar.MINUTE, 10);
    Date teenMinutesFromNow = now.getTime();

En Java 8 tenemos nueva API:

    LocalDateTime dateTime = LocalDateTime.now().plus(Duration.of(10, ChronoUnit.MINUTES));
    Date tmfn = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
Marco Montel
fuente
17

Esto está incorrectamente especificado:

SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");

Estás usando minutos en lugar de meses (MM)

Dawood
fuente
6

tl; dr

LocalDateTime.parse( 
    "2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )

java.time

Utilice las excelentes clases java.time para el trabajo de fecha y hora. Estas clases reemplazan las problemáticas clases de fecha y hora antiguas como java.util.Datey java.util.Calendar.

ISO 8601

Las clases java.time utilizan formatos estándar ISO 8601 de forma predeterminada para analizar / generar cadenas de valores de fecha y hora. Para que su cadena de entrada cumpla, reemplace el ESPACIO en el medio con un T.

String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );

LocalDateTime

Analice su cadena de entrada como una, LocalDateTimeya que carece de información sobre la zona horaria o el desplazamiento de UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Agregue diez minutos.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

ldt.toString (): 2016-01-23T12: 34

ldtLater.toString (): 2016-01-23T12: 44

Vea el código en vivo en IdeOne.com .

Eso LocalDateTimeno tiene zona horaria, por lo que no representa un punto en la línea de tiempo. Aplicar una zona horaria para traducir a un momento real. Especificar un nombre de zona horaria correcta en el formato de continent/region, por ejemplo America/Montreal, Africa/Casablancao Pacific/Auckland, u Asia/Karachi. Nunca use el 3-4 abreviatura de letras tales como ESTo IST, o PKT, ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera único (!).

ZonedDateTime

Si conoce la zona horaria prevista para este valor, aplique un ZoneIdpara obtener un ZonedDateTime.

ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );

zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Asia / Karachi]

Anomalías

Piense si agregar esos diez minutos antes o después de agregar una zona horaria. Puede obtener un resultado muy diferente debido a anomalías como el horario de verano (DST) que cambian la hora del reloj de pared .

El hecho de que deba agregar los 10 minutos antes o después de agregar la zona depende del significado de su escenario comercial y las reglas.

Sugerencia: cuando desee un momento específico en la línea de tiempo, mantenga siempre la información de la zona horaria . No pierda esa información, como lo hizo con sus datos de entrada. ¿Se 12:34supone que el valor sea ​​mediodía en Pakistán, mediodía en Francia o mediodía en Québec? Si se refería al mediodía en Pakistán, dígalo incluyendo al menos el desplazamiento de UTC ( +05:00), y mejor aún, el nombre de la zona horaria ( Asia/Karachi).

Instant

Si desea el mismo momento visto a través de la lente de UTC , extraiga un archivo Instant. La Instantclase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

Instant instant = zdt.toInstant();

Convertir

Evite las problemáticas clases antiguas de fecha y hora siempre que sea posible. Pero si debe hacerlo, puede convertir. Llame a los nuevos métodos agregados a las clases antiguas.

java.util.Date utilDate = java.util.Date.from( instant );

Acerca de 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 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 .

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas funciones y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Vea Cómo usar… .

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 .

Albahaca Bourque
fuente
4

Hay un error en el patrón de SimpleDateFormat. debería ser

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Baldrick
fuente
4

usa este formato,

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");

mm por minutos y MM por mes

Kushan
fuente
2

Una vez que haya analizado su fecha, uso esta función de utilidad para agregar horas, minutos o segundos:

public class DateTimeUtils {
    private static final long ONE_HOUR_IN_MS = 3600000;
    private static final long ONE_MIN_IN_MS = 60000;
    private static final long ONE_SEC_IN_MS = 1000;

    public static Date sumTimeToDate(Date date, int hours, int mins, int secs) {
        long hoursToAddInMs = hours * ONE_HOUR_IN_MS;
        long minsToAddInMs = mins * ONE_MIN_IN_MS;
        long secsToAddInMs = secs * ONE_SEC_IN_MS;
        return new Date(date.getTime() + hoursToAddInMs + minsToAddInMs + secsToAddInMs);
    }
}

Tenga cuidado al agregar largos períodos de tiempo, 1 día no siempre es 24 horas (ajustes de tipo de ahorro de luz diurna, segundos intercalares, etc.), Calendarse recomienda para eso.

David Miguel
fuente
1

Trabaja para mí DateUtils

//import
import org.apache.commons.lang.time.DateUtils

...

        //Added and removed minutes to increase current range dates
        Date horaInicialCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaInicial.getTime()),-1)
        Date horaFinalCorteEspecial = DateUtils.addMinutes(new Date(corteEspecial.horaFinal.getTime()),1)
Samuel Ivan
fuente
2
¿Cómo mejora esta respuesta con respecto a la del año pasado publicada por alireza alallah ? Además, la Pregunta se refería a minutos, no a segundos.
Basil Bourque
1

Se puede hacer sin las constantes (como 3600000 ms es 1h)

public static Date addMinutesToDate(Date date, int minutes) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

public static Date addHoursToDate(Date date, int hours) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, hours);
    return calendar.getTime();
}

ejemplo de uso:

System.out.println(new Date());
System.out.println(addMinutesToDate(new Date(), 5));

Tue May 26 16:16:14 CEST 2020
Tue May 26 16:21:14 CEST 2020
Marek Manduch
fuente
1
Estas terribles clases de fecha y hora fueron suplantadas hace años por las clases modernas de java.time , a partir de la adopción de JSR 310.
Basil Bourque
-2

Solo para cualquiera que esté interesado. Estaba trabajando en un proyecto de iOS que requería una funcionalidad similar, así que terminé portando la respuesta de @jeznag a swift

private func addMinutesToDate(minutes: Int, beforeDate: NSDate) -> NSDate {
    var SIXTY_SECONDS = 60

    var m = (Double) (minutes * SIXTY_SECONDS)
    var c =  beforeDate.timeIntervalSince1970  + m
    var newDate = NSDate(timeIntervalSince1970: c)

    return newDate
}
tawhid
fuente
La fecha de Swift ya tenía una función incorporada similar, por ejemplo, Date (timeInterval:, since:)
Albert