Tôi đang cố gắng tính toán sự khác biệt giữa hai LocalDateTime
.
Đầu ra cần phải có định dạng y years m months d days h hours m minutes s seconds
. Đây là những gì tôi đã viết:
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;
public class Main {
static final int MINUTES_PER_HOUR = 60;
static final int SECONDS_PER_MINUTE = 60;
static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
public static void main(String[] args) {
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 9, 19, 46, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Period period = getPeriod(fromDateTime, toDateTime);
long time[] = getTime(fromDateTime, toDateTime);
System.out.println(period.getYears() + " years " +
period.getMonths() + " months " +
period.getDays() + " days " +
time[0] + " hours " +
time[1] + " minutes " +
time[2] + " seconds.");
}
private static Period getPeriod(LocalDateTime dob, LocalDateTime now) {
return Period.between(dob.toLocalDate(), now.toLocalDate());
}
private static long[] getTime(LocalDateTime dob, LocalDateTime now) {
LocalDateTime today = LocalDateTime.of(now.getYear(),
now.getMonthValue(), now.getDayOfMonth(), dob.getHour(), dob.getMinute(), dob.getSecond());
Duration duration = Duration.between(today, now);
long seconds = duration.getSeconds();
long hours = seconds / SECONDS_PER_HOUR;
long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
long secs = (seconds % SECONDS_PER_MINUTE);
return new long[]{hours, minutes, secs};
}
}
Đầu ra mà tôi đang nhận được là 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Tôi đã kiểm tra kết quả của mình từ trang web này (với các giá trị 12/16/1984 07:45:55
và 09/09/2014 19:46:45
). Ảnh chụp màn hình sau đây cho thấy đầu ra:
Tôi khá chắc chắn rằng các trường sau giá trị tháng đang đến từ mã của tôi. Bất kỳ đề nghị sẽ rất hữu ích.
Cập nhật
Tôi đã kiểm tra kết quả của mình từ một trang web khác và kết quả tôi nhận được là khác nhau. Đây là: Tính thời lượng giữa hai ngày (kết quả: 29 năm, 8 tháng, 24 ngày, 12 giờ, 0 phút và 50 giây).
Cập nhật
Vì tôi nhận được hai kết quả khác nhau từ hai trang web khác nhau, tôi tự hỏi liệu thuật toán tính toán của tôi có hợp pháp hay không. Nếu tôi sử dụng hai LocalDateTime
đối tượng sau:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Sau đó, đầu ra đang đến: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Từ liên kết này nên được 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Vì vậy, thuật toán cần phải xử lý các số âm quá.
Lưu ý câu hỏi không phải là về trang web nào cho tôi kết quả, tôi cần biết đúng thuật toán và cần phải có kết quả đúng.
7:45:55
và thời gian kết thúc 19:46:45
(hoặc 7:46:45
PM). Vì vậy, sự khác biệt giữa hai lần đó là 12 giờ, 0 phút và 50 giây và không bao giờ 23 giờ, 34 phút và 12 giây. Vì vậy, tính toán thực tế của bạn dường như là chính xác, ít nhất là về phần thời gian.
LocalDateTime
không có múi giờ, nên có thể không có câu trả lời duy nhất. Ngay cả khi bạn cho rằng các múi giờ bắt đầu và kết thúc là như nhau, thì trong một số khu vực nhất định như 2014-09-09 sẽ là Giờ tiết kiệm ánh sáng ban ngày hoặc Giờ mùa hè và ở các khu vực khác thì không. Điều này có thể ném mọi thứ đi một giờ. Vì vậy, tính toán sự khác biệt đến lần thứ hai là vô nghĩa trừ khi điều này được giải quyết.
LocalDateTime
mang lại kết quả không thực tế, vì lớp đó cố tình thiếu bất kỳ khái niệm nào về múi giờ hoặc bù từ UTC? Đối với các giá trị thực tế, chỉ định một múi giờ thông qua ZoneId
để sử dụng ZonedDateTime
.
Period.between()
áp dụng một số làm tròn?