Come aggiungere minuti alla mia data


110

Ho questo oggetto data:

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

il valore di d1 è Fri Jan 07 17:40:00 PKT 2011

Ora sto cercando di aggiungere 10 minuti alla data sopra.

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

Valore delle newTimemodifiche a 2011-50-07 17:50 ma dovrebbe essere 07-01-2011 17:50.

Aggiunge minuti correttamente ma cambia anche mese, non so perché!



Risposte:


193

Il problema per te è che stai usando mm. Dovresti usare MM. MMè per il mese e mmper i minuti. Prova conyyyy-MM-dd HH:mm

Altro approccio:

Può essere semplice come questo (un'altra opzione è usare 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));

grazie, ho provato, la data viene correttamente, ma quando provo a cambiarla come stringa, mi dà lo stesso risultato sbagliato String newTime = df.format (afterAddingTenMins); mi dà 2011-50-07 17:50, devo convertirlo in String, qualsiasi suggerimento
junaidp

1
@junaidp hai usato l'ultimo bit di codice, ma hai ignorato la prima parte della soluzione?
Carl

57

puoi usare la classe DateUtils nel pacchetto org.apache.commons.lang3.time

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute

1
Per chi ha a che fare con la versione precedente di DateUtils, è presente nel pacchetto ->org.apache.commons.lang.time.DateUtils
realPK

32

Metodo pratico per implementare la risposta di @ 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;
}

26

Per evitare qualsiasi dipendenza puoi usare java.util.Calendar come segue:

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

In Java 8 abbiamo una nuova API:

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

17

Questo è specificato in modo errato:

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

Stai usando i minuti invece del mese (MM)


6

tl; dr

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

java.time

Usa le eccellenti classi java.time per il lavoro data-ora. Queste classi sostituiscono le fastidiose classi data-ora come java.util.Datee java.util.Calendar.

ISO 8601

Le classi java.time utilizzano i formati ISO 8601 standard per impostazione predefinita per l'analisi / la generazione di stringhe di valori di data e ora. Per rendere conforme la stringa di input, sostituire lo SPAZIO al centro con un T.

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

LocalDateTime

Analizza la tua stringa di input LocalDateTimecome se mancasse di informazioni sul fuso orario o sull'offset da UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Aggiungi dieci minuti.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Guarda il codice live su IdeOne.com .

Non LocalDateTimeha fuso orario, quindi non rappresenta un punto sulla sequenza temporale. Applica un fuso orario per tradurre in un momento reale. Specificare un nome proprio fuso orario nel formato continent/region, come ad esempio America/Montreal, Africa/Casablancao Pacific/Auckland, o Asia/Karachi. Non usare mai il 3-4 lettera sigla come ESTo ISTo PKTcome sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).

ZonedDateTime

Se conosci il fuso orario previsto per questo valore, applica a ZoneIdper ottenere un ZonedDateTime.

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

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

anomalie

Pensa se aggiungere quei dieci minuti prima o dopo aver aggiunto un fuso orario. È possibile ottenere un risultato molto diverso a causa di anomalie come l'ora legale (DST) che spostano l' ora dell'orologio da parete .

La necessità di aggiungere i 10 minuti prima o dopo l'aggiunta della zona dipende dal significato dello scenario e delle regole aziendali.

Suggerimento: quando intendi un momento specifico sulla sequenza temporale, mantieni sempre le informazioni sul fuso orario . Non perdere queste informazioni, come fatto con i tuoi dati di input. Il valore 12:34deve essere mezzogiorno in Pakistan o mezzogiorno in Francia o mezzogiorno in Québec? Se intendevi mezzogiorno in Pakistan, dillo includendo almeno l'offset da UTC ( +05:00) e, meglio ancora, il nome del fuso orario ( Asia/Karachi).

Instant

Se vuoi lo stesso momento visto attraverso l'obiettivo di UTC , estrai un file Instant. La Instantclasse rappresenta un momento sulla sequenza temporale in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).

Instant instant = zdt.toInstant();

Convertire

Evita le fastidiose lezioni di data e ora quando possibile. Ma se devi, puoi convertirti. Chiama nuovi metodi aggiunti alle vecchie classi.

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

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione a java.time.

Per saperne di più, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


4

C'è un errore nel modello del tuo SimpleDateFormat. dovrebbe essere

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

4

usa questo formato,

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

mm per i minuti e MM per il mese


2

Dopo aver analizzato la data, utilizzo questa funzione di utilità per aggiungere ore, minuti o secondi:

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);
    }
}

Fare attenzione quando si aggiungono lunghi periodi di tempo, 1 giorno non è sempre 24 ore (regolazioni di tipo ora legale, secondi intercalari e così via), Calendarè consigliato per questo.


1

Lavora per me 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)

2
In che modo questa risposta migliora rispetto a quella dell'anno scorso pubblicata da alireza alallah ? Inoltre, la domanda si riferiva ai minuti, non ai secondi.
Basil Bourque

1

Può essere fatto senza le costanti (come 3600000 ms è 1 ora)

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();
}

esempio di utilizzo:

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

1
Queste terribili lezioni di data e ora furono soppiantate anni fa dalle moderne classi java.time , a partire dall'adozione di JSR 310.
Basil Bourque,

-2

Solo per chiunque sia interessato. Stavo lavorando a un progetto iOS che richiedeva funzionalità simili, quindi ho finito di portare la risposta di @jeznag su 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
}

La data di Swift aveva già una funzione incorporata simile, ad esempio Date (timeInterval:, since:)
Albert
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.