Como encontrar a diferença entre dois Joda-Time DateTimes em minutos


141

Abaixo está o método que escrevi:

public List<Map<String, Object>> loadNotYetInEmployee(int shift, Date date,
        int transitionVal, String type, User user) {

    DateTime datetime = new DateTime(date);
    datetime = datetime
            .plus(Period.minutes(shiftTiming.getSession1InTime()));

    List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

    sql = SqlMapUtils.getSql("attendance.attendancestatus.latein",
            parameters);
    result = getJdbcTemplate().queryForList(sql);
    for (int i = 0; i < result.size(); i++) {
        Date punchInTime = (Date) result.get(i).get("punchtime");
        DateTime punchTime = new DateTime(punchInTime);
    }
    return result;
}

Agora, no meu método, você pode ver que eu tenho um objeto Joda-Time DateTime no objeto nomeado datetimee, do meu resultado, estou obtendo um carimbo de data e hora que estou convertendo para jodatime punchTime. Agora eu quero descobrir a diferença entre essas duas datas, como faço isso?



2
Mas isso só funcionará se seus objetos DateTime estiverem no mesmo fuso horário.
Tiago

1
Days.daysBetween(d1, d2)É o vizinho de seu amigo
Shubham Chaudhary

Respostas:


79

Isso fará a diferença entre dois objetos DateTime em milissegundos:

DateTime d1 = new DateTime();
DateTime d2 = new DateTime();

long diffInMillis = d2.getMillis() - d1.getMillis();

78
A resposta do MadProgrammer deveria ter sido a resposta aceita. Observe o simples uso de Minutes.minutesBetween.
Basil Bourque

5
Não discordo, é muito prolixo e claro: "Os minutos minutos entre o tempo de data tempo punch" é pior do que "segundo milissegundos de data menos primeiros milissegundos de data"
Jonathan Neufeld

4
Isso não levará em consideração o horário de verão.
Sander Versluys

454

Algo como...

DateTime today = new DateTime();
DateTime yesterday = today.minusDays(1);

Duration duration = new Duration(yesterday, today);
System.out.println(duration.getStandardDays());
System.out.println(duration.getStandardHours());
System.out.println(duration.getStandardMinutes());

Quais saídas

1
24
1440

ou

System.out.println(Minutes.minutesBetween(yesterday, today).getMinutes());

O que provavelmente é mais do que você procura


O exposto acima leva em consideração os fusos horários? Ou devo converter primeiro em UTC / GMT?
Doo Dah

@DooDah Essa é uma boa pergunta, eu "acredito" que sim (como JodaTime tem o conceito de LocalTime), mas eu sugiro que você teste e veja. A questão seria: em qual fuso horário o valor resultante seria representado?
precisa saber é o seguinte

Vou testar e descobrir isso. Para mim, o fuso horário resultante provavelmente será o servidor em que o código está sendo executado. Estou implementando uma fila agendada e precisarei calcular a quantidade de tempo entre agora e algum horário futuro com base em uma data de outro fuso horário. Vou relatar o que encontrar.
Doo Dah

2
Concordo que deveria ter sido a resposta selecionada. É puro e simples.
Sid

Criar um novo objeto Duration apenas para obter uma diferença de horário não é legal. Imagine ter que fazer uma diferença de horário em uma grande variedade de objetos de data / hora.
AndroidDev

7

Algo como...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();

Falha se as datas de início e término estiverem muito distantes (maior que o tamanho de int)
dannyRods 09/01

3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

Na prática, acho que isso sempre dará o mesmo resultado que a resposta com base Duration. Porém, para uma unidade de tempo diferente de minutos, pode ser mais correto. Por exemplo, existem 365 dias de 2/2/16 a 1/2/2017, mas na verdade é menos de 1 ano e deve truncar para 0 anos se você usar PeriodType.years().

Em teoria, o mesmo poderia acontecer por minutos por causa de segundos bissextos, mas Joda não suporta segundos bissextos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.