Como adicionar minutos à minha data

110

Eu tenho este objeto de data:

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

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

Agora estou tentando adicionar 10 minutos à data acima.

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

Valor das newTimemudanças, 2011-50-07 17:50 mas deveria ser 07-01-2011 17:50.

Ele adiciona minutos corretamente, mas também muda de mês, não sei por quê!

Junaidp
fonte
possível duplicata de Java, adicionando minutos a uma data, anomalia estranha
Basil Bourque
Possível duplicata de Como adiciono um mês à data atual em Java?
Bamboomy

Respostas:

193

O problema para você é que você está usando mm. Você deve usar MM. MMé para mês e mmé para minutos. Tente comyyyy-MM-dd HH:mm

Outra abordagem:

Pode ser tão simples quanto isto (outra opção é usar o tempo joda )

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
fonte
obrigado, tentei fazer isso, a data está chegando corretamente, mas quando tento alterá-la como string, recebo o mesmo resultado errado String newTime = df.format (afterAddingTenMins); dá-me 2011-50-07 17:50, tenho que convertê-lo em String, qualquer sugestão
junaidp
1
@junaidp você usou o último trecho de código, mas ignorou a primeira parte da solução?
Carl
57

você pode usar a classe DateUtils no pacote org.apache.commons.lang3.time

int addMinuteTime = 5;
Date targetTime = new Date(); //now
targetTime = DateUtils.addMinutes(targetTime, addMinuteTime); //add minute
Alireza Alallah
fonte
1
Para as pessoas que lidam com a versão mais antiga do DateUtils, está presente no pacote ->org.apache.commons.lang.time.DateUtils
realPK
32

Método de conveniência para implementar a resposta 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
fonte
25

Para evitar qualquer dependência, você pode usar java.util.Calendar da seguinte forma:

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

No Java 8, temos uma nova API:

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

Isso está especificado incorretamente:

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

Você está usando minutos em vez de mês (MM)

Dawood
fonte
6

tl; dr

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

java.time

Use as excelentes classes java.time para trabalho de data e hora. Essas classes substituem as antigas classes problemáticas de data e hora, como java.util.Datee java.util.Calendar.

ISO 8601

As classes java.time usam formatos ISO 8601 padrão por padrão para analisar / gerar strings de valores de data e hora. Para que sua string de entrada esteja em conformidade, substitua o ESPAÇO no meio por a T.

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

LocalDateTime

Analise sua string de entrada como um, LocalDateTimepois ela não possui informações sobre fuso horário ou deslocamento do UTC.

LocalDateTime ldt = LocalDateTime.parse( inputModified );

Adicione dez minutos.

LocalDateTime ldtLater = ldt.plusMinutes( 10 );

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

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

Veja o código ao vivo em IdeOne.com .

Isso LocalDateTimenão tem fuso horário, então não representa um ponto na linha do tempo. Aplique um fuso horário para traduzir para um momento real. Especifique um nome próprio fuso horário no formato continent/region, como America/Montreal, Africa/Casablanca, ou Pacific/Auckland, ou Asia/Karachi. Nunca utilize o 3-4 letras, como ESTou ISTou PKTcomo eles são não zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).

ZonedDateTime

Se você souber o fuso horário pretendido para este valor, aplique a ZoneIdpara obter a ZonedDateTime.

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

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

Anomalias

Pense em adicionar esses dez minutos antes ou depois de adicionar um fuso horário. Você pode obter um resultado muito diferente por causa de anomalias como o horário de verão (DST) que altera o horário do relógio de parede .

Se você deve adicionar 10 minutos antes ou depois de adicionar a zona, depende do significado de seu cenário de negócios e regras.

Dica: quando você pretende um momento específico na linha do tempo, sempre mantenha as informações de fuso horário . Não perca essa informação, como acontece com seus dados de entrada. O valor 12:34significa meio-dia no Paquistão, meio-dia na França ou meio-dia em Québec? Se você quis dizer meio-dia no Paquistão, diga isso incluindo pelo menos o deslocamento do UTC ( +05:00) e, melhor ainda, o nome do fuso horário ( Asia/Karachi).

Instant

Se você deseja o mesmo momento visto pelas lentes do UTC , extraia umInstant . A Instantclasse representa um momento na linha do tempo em UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).

Instant instant = zdt.toInstant();

Converter

Evite as velhas classes problemáticas de data e hora sempre que possível. Mas se for preciso, você pode se converter. Chame novos métodos adicionados às classes antigas.

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

Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, comojava.util.Date , Calendar, e SimpleDateFormat.

o projeto Joda-Time , agora em modo de manutenção , aconselha a migração para java.time.

Para saber mais, veja o Tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Onde obter as classes java.time?

  • Java SE 8 e SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação agrupada.
    • Java 9 adiciona alguns recursos e correções menores.
  • Java SE 6 e SE 7
    • Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
  • Android
    • O ThreeTenABP projeto adapta ThreeTen-Backport (mencionado acima) para o Android especificamente.
    • Veja como usar… .

O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte
4

Há um erro no padrão do seu SimpleDateFormat. deveria ser

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

use este formato,

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

mm para minutos e MM para mês

Kushan
fonte
2

Depois de analisar a data, uso esta função de utilidade para adicionar horas, minutos ou 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);
    }
}

Tenha cuidado ao adicionar longos períodos de tempo, 1 dia nem sempre é 24 horas (ajustes do tipo horário de verão, segundos intercalados e assim por diante), Calendaré recomendado para isso.

David Miguel
fonte
1

Trabalhe para mim 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
fonte
2
Como esta resposta melhora a do ano passado postada por alireza alallah ? Além disso, a pergunta se referia a minutos, não segundos.
Basil Bourque
1

Pode ser feito sem as constantes (como 3600000 ms é 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();
}

exemplo 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
fonte
1
Essas classes de data e hora terríveis foram suplantadas anos atrás pelas classes java.time modernas , a partir da adoção da JSR 310.
Basil Bourque
-2

Apenas para quem está interessado. Eu estava trabalhando em um projeto iOS que exigia funcionalidade semelhante, então terminei de portar a resposta de @jeznag para o 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
}
tawheed
fonte
A data do Swift já tinha uma função integrada semelhante, por exemplo Date (timeInterval:, desde:)
Albert