Cara menemukan perbedaan antara dua Joda-Time DateTimes dalam hitungan menit

141

Di bawah ini adalah metode yang saya tulis:

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

Sekarang dari metode saya, Anda dapat melihat saya memiliki objek Joda-Time DateTime di objek bernama datetimedan dari hasil saya, saya mendapatkan satu cap waktu yang saya konversi menjadi jodatime punchTime. Sekarang saya ingin mengetahui perbedaan antara dua tanggal ini, bagaimana saya melakukannya?

Deepak Kumar
sumber
9
Menit # menitDi antara Anda adalah teman.
Luiggi Mendoza
2
Tetapi ini hanya akan berfungsi jika objek DateTime Anda berada di TimeZone yang sama.
Tiago
1
Days.daysBetween(d1, d2)adalah tetangga teman Anda
Shubham Chaudhary

Jawaban:

79

Ini akan memberi Anda perbedaan antara dua objek DateTime dalam milidetik:

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

long diffInMillis = d2.getMillis() - d1.getMillis();
alfredaday
sumber
78
Jawaban oleh MadProgrammer seharusnya adalah Jawaban yang Diterima. Perhatikan penggunaan sederhana Minutes.minutesBetween.
Basil Bourque
5
Tidak, saya tidak setuju, terlalu bertele-tele dan tidak jelas: "Menit menit antara waktu tanggal waktu pukulan" lebih buruk daripada "milidetik kencan kedua minus milidetik kencan pertama"
Jonathan Neufeld
4
Ini tidak akan memperhitungkan penghematan siang hari.
Sander Versluys
454

Sesuatu seperti...

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

Output yang mana

1
24
1440

atau

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

Yang mungkin lebih dari apa yang Anda cari

Program Mad
sumber
Apakah hal di atas memperhitungkan zona waktu akun? Atau haruskah saya mengonversi ke UTC / GMT terlebih dahulu?
Doo Dah
@DooDah Itu pertanyaan yang bagus, saya "percaya" itu (karena JodaTime memiliki konsep LocalTime), tapi saya sarankan Anda mengujinya dan lihat. Namun pertanyaannya adalah, di zona waktu mana nilai yang dihasilkan diwakili?
MadProgrammer
Saya akan menguji dan mencari tahu ini. Bagi saya, zona waktu yang dihasilkan kemungkinan adalah server tempat kode berjalan. Saya menerapkan antrian yang dijadwalkan dan perlu menghitung jumlah waktu antara sekarang dan beberapa waktu mendatang berdasarkan tanggal dari zona waktu lain. Saya akan melaporkan kembali apa yang saya temukan.
Doo Dah
2
Saya setuju, ini seharusnya jawaban yang dipilih. Rapi dan sederhana.
Sid
Membuat objek Durasi baru hanya untuk mendapatkan perbedaan waktu tidak keren. Bayangkan harus melakukan perbedaan waktu pada array besar objek tanggal / waktu.
AndroidDev
7

Sesuatu seperti...

Minutes.minutesBetween(getStart(), getEnd()).getMinutes();
Carlos Chaguendo
sumber
Gagal jika tanggal mulai dan berakhir benar-benar berjauhan (lebih besar dari ukuran int)
dannyRods
3
DateTime d1 = ...;
DateTime d2 = ...;
Period period = new Period(d1, d2, PeriodType.minutes());
int differenceMinutes = period.getMinutes();

Dalam praktiknya saya pikir ini akan selalu memberikan hasil yang sama dengan jawaban berdasarkan Duration. Namun, untuk unit waktu yang berbeda dari menit, mungkin lebih tepat. Misalnya ada 365 hari dari 2016/2/2 hingga 2017/2/1, tetapi sebenarnya itu kurang dari 1 tahun dan harus dipotong hingga 0 tahun jika Anda menggunakannya PeriodType.years().

Secara teori hal yang sama dapat terjadi selama beberapa menit karena detik kabisat, tetapi Joda tidak mendukung detik kabisat.

Bintang fajar
sumber