Saya mencoba menghitung perbedaan antara dua LocalDateTime
.
Keluaran harus dalam format y years m months d days h hours m minutes s seconds
. Inilah yang saya tulis:
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};
}
}
Output yang saya dapatkan adalah 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Saya telah memeriksa hasil saya dari situs web ini (dengan nilai-nilai12/16/1984 07:45:55
dan 09/09/2014 19:46:45
). Tangkapan layar berikut menunjukkan output:
Saya cukup yakin bahwa bidang setelah nilai bulan salah dari kode saya. Setiap saran akan sangat membantu.
Memperbarui
Saya telah menguji hasil saya dari situs web lain dan hasil yang saya dapatkan berbeda. Ini dia: Hitung durasi antara dua tanggal (hasil: 29 tahun, 8 bulan, 24 hari, 12 jam, 0 menit dan 50 detik).
Memperbarui
Karena saya mendapat dua hasil berbeda dari dua situs yang berbeda, saya bertanya-tanya apakah algoritma perhitungan saya sah atau tidak. Jika saya menggunakan dua LocalDateTime
objek berikut :
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Maka output akan datang: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Dari tautan ini seharusnya29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Jadi algoritma perlu menangani angka negatif juga.
Perhatikan pertanyaannya bukan tentang situs mana yang memberi saya hasil apa, saya perlu tahu algoritma yang tepat dan harus memiliki hasil yang benar.
7:45:55
dan waktu akhir 19:46:45
(atau 7:46:45
PM). Jadi perbedaan antara kedua waktu itu adalah 12 jam, 0 menit dan 50 detik dan tidak pernah 23 jam, 34 menit dan 12 detik. Jadi perhitungan Anda tampaknya benar, setidaknya pada bagian waktu.
LocalDateTime
tidak memiliki zona waktu, mungkin tidak ada jawaban yang unik. Bahkan jika Anda menganggap zona waktu mulai dan akhir adalah sama, di zona tertentu tanggal seperti 2014-09-09 akan berada di Waktu Musim Panas atau Musim Panas dan di tempat lain tidak. Ini mungkin membuang beberapa jam. Jadi menghitung perbedaan ke yang kedua tidak ada artinya kecuali ini diselesaikan.
LocalDateTime
hasil tidak realistis, karena kelas itu sengaja tidak memiliki konsep zona waktu atau offset-dari-UTC? Untuk nilai realistis, tetapkan zona waktu via ZoneId
untuk digunakan ZonedDateTime
.
Period.between()
menerapkan pembulatan?