Cách tìm sự khác biệt giữa hai DateTimes Joda trong vài phút


141

Dưới đây là phương pháp tôi đã viết:

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

Bây giờ từ phương thức của tôi, bạn có thể thấy tôi có một đối tượng DateTime thời gian Joda trong đối tượng được đặt tên và từ kết quả của tôi, tôi nhận được một dấu thời gian mà tôi đang chuyển đổi thành jodatime . Bây giờ tôi muốn tìm ra sự khác biệt giữa hai ngày này, làm thế nào để tôi làm điều đó?datetimepunchTime


9
Phút # phút Giữa là bạn của bạn.
Luiggi Mendoza

2
Nhưng điều này sẽ chỉ hoạt động nếu các đối tượng DateTime của bạn ở cùng TimeZone.
Tiago

1
Days.daysBetween(d1, d2)là hàng xóm của bạn của bạn
Shubham Chaudhary

Câu trả lời:


79

Điều này sẽ giúp bạn có sự khác biệt giữa hai đối tượng DateTime tính bằng mili giây:

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

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

78
Câu trả lời của MadProgrammer nên là Câu trả lời được chấp nhận. Chú ý sử dụng đơn giản Minutes.minutesBetween.
Basil Bourque

5
Không, tôi không đồng ý, nó quá dài dòng và không rõ ràng: "Số phút giữa thời gian ngày kết thúc" tệ hơn "ngày thứ hai mili giây trừ đi ngày mili giây đầu tiên"
Jonathan Neufeld

4
Điều này sẽ không có tiết kiệm ánh sáng ban ngày vào tài khoản.
Sander Versluys

454

Cái gì đó như...

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

Đầu ra nào

1
24
1440

hoặc là

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

Đó có lẽ là nhiều hơn những gì bạn đang theo đuổi


Có phải ở trên có tính đến múi giờ? Hay tôi nên chuyển đổi sang UTC / GMT trước?
Doo Dah

@DooDah Đó là một câu hỏi hay, tôi "tin" rằng nó (vì JodaTime có khái niệm về LocalTime), nhưng tôi sẽ đề nghị bạn kiểm tra và xem. Câu hỏi sẽ là mặc dù, theo múi giờ, giá trị kết quả sẽ được biểu thị trong?
MadProgrammer

Tôi sẽ kiểm tra và tìm ra điều này. Đối với tôi, múi giờ kết quả có thể sẽ là máy chủ mà mã đang chạy. Tôi đang thực hiện một hàng đợi theo lịch trình và sẽ cần tính toán lượng thời gian từ bây giờ đến một số thời gian trong tương lai dựa trên một ngày từ múi giờ khác. Tôi sẽ báo cáo lại những gì tôi tìm thấy.
Doo Dah

2
Tôi đồng ý, đây nên là câu trả lời được lựa chọn. Nó gọn gàng và đơn giản.
Sid

Tạo một đối tượng Thời lượng mới chỉ để có sự khác biệt về thời gian không phải là tuyệt vời. Hãy tưởng tượng bạn phải thực hiện chênh lệch thời gian trên một mảng lớn các đối tượng ngày / giờ.
AndroidDev

7

Cái gì đó như...

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

Thất bại nếu ngày bắt đầu và ngày kết thúc thực sự cách xa nhau (lớn hơn kích thước của int)
dannyRods

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

Trong thực tế tôi nghĩ rằng điều này sẽ luôn cho kết quả giống như câu trả lời dựa trên Duration. Tuy nhiên, đối với một đơn vị thời gian khác với phút, nó có thể đúng hơn. Ví dụ: có 365 ngày từ 2016/2/2 đến 2017/2/1, nhưng thực tế là dưới 1 năm và nên rút ngắn xuống 0 năm nếu bạn sử dụng PeriodType.years().

Về lý thuyết, điều tương tự có thể xảy ra trong vài phút vì những giây nhuận, nhưng Joda không hỗ trợ những giây nhuận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.