วิธีค้นหาความแตกต่างระหว่างวันที่และเวลาสองเวลาในไม่กี่นาที


141

ด้านล่างเป็นวิธีที่ฉันเขียน:

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

ตอนนี้จากวิธีของฉันคุณสามารถเห็นฉันมีJoda เวลา DateTimeวัตถุในวัตถุชื่อdatetimeและจากผลของฉันฉันได้รับการประทับเวลาหนึ่งซึ่งฉันกำลังแปลงไป punchTimejodatime ตอนนี้ฉันต้องการทราบความแตกต่างระหว่างสองวันนี้ฉันจะทำอย่างไร


9
นาที # นาทีระหว่างนั้นคือเพื่อนของคุณ
Luiggi Mendoza

2
แต่จะใช้งานได้ก็ต่อเมื่อวัตถุ DateTime ของคุณอยู่ในเขตเวลาเดียวกัน
Tiago

1
Days.daysBetween(d1, d2)เป็นเพื่อนบ้านของคุณ
Shubham Chaudhary

คำตอบ:


79

สิ่งนี้จะทำให้คุณได้รับความแตกต่างระหว่างวัตถุ DateTime สองรายการในหน่วยมิลลิวินาที:

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

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

78
คำตอบโดย MadProgrammer ควรเป็นคำตอบที่ได้รับการยอมรับ Minutes.minutesBetweenขอให้สังเกตการใช้งานที่เรียบง่ายของ
Basil Bourque

5
ไม่ฉันไม่เห็นด้วยมันพูดมากเกินไปและไม่ชัดเจน: "นาทีนาทีระหว่างเวลานัดเวลาหมัด" แย่กว่า "มิลลิวินาทีวันที่สองลบด้วยมิลลิวินาทีวันแรก"
Jonathan Neufeld

4
สิ่งนี้จะไม่คำนึงถึงการประหยัดเวลากลางวัน
Sander Versluys

454

สิ่งที่ต้องการ...

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

ซึ่งเอาท์พุท

1
24
1440

หรือ

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

ซึ่งอาจเป็นมากกว่าสิ่งที่คุณหลังจาก


การดำเนินการด้านบนคำนึงถึงเขตเวลาของบัญชีหรือไม่? หรือฉันควรแปลงเป็น UTC / GMT ก่อน?
Doo Dah

@DooDah เป็นคำถามที่ดีฉัน "เชื่อ" (เช่น JodaTime มีแนวคิดLocalTime) แต่ฉันขอแนะนำให้คุณทดสอบและดู คำถามจะเป็นอย่างไรในเขตเวลาใดที่จะแสดงค่าผลลัพธ์ใน
MadProgrammer

ฉันจะทดสอบและคิดออก สำหรับฉันเขตเวลาที่ได้จะเป็นเซิร์ฟเวอร์ที่โค้ดกำลังทำงานอยู่ ฉันกำลังใช้คิวที่กำหนดเวลาไว้และจะต้องคำนวณจำนวนเวลาระหว่างนี้และบางเวลาในอนาคตตามวันที่จากเขตเวลาอื่น ฉันจะรายงานสิ่งที่พบกลับมา
Doo Dah

2
ฉันเห็นด้วยนี่ควรเป็นคำตอบที่เลือก มันประณีตและเรียบง่าย
Sid

การสร้างวัตถุ Duration ใหม่เพื่อให้ได้ความแตกต่างเวลาก็ไม่เจ๋ง ลองนึกภาพว่าต้องทำการแตกต่างของเวลากับวัตถุวันที่ / เวลาจำนวนมาก
AndroidDev

7

สิ่งที่ต้องการ...

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

ล้มเหลวหากวันที่เริ่มต้นและวันที่สิ้นสุดอยู่ห่างจากกันมาก (มากกว่าขนาดของ int)
dannyRods

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

ในทางปฏิบัติฉันคิดว่าสิ่งนี้จะให้ผลลัพธ์เหมือนกับคำตอบDurationเสมอ สำหรับหน่วยเวลาที่แตกต่างจากนาที แต่มันอาจจะถูกต้องมากขึ้น ตัวอย่างเช่นมี 365 วันนับจาก 2016/02/02 2017/02/01 ไป แต่จริง ๆ แล้วมันเป็นน้อยกว่า 1 ปีและควรตัดถึง 0 PeriodType.years()ปีถ้าคุณใช้

ในทางทฤษฎีแล้วสิ่งนี้อาจเกิดขึ้นได้เป็นนาทีเนื่องจากวินาทีกระโดด แต่ Joda ไม่สนับสนุนวินาทีกระโดด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.