İkisi arasındaki farkı hesaplamaya çalışıyorum LocalDateTime
.
Çıktının formatta olması gerekir y years m months d days h hours m minutes s seconds
. İşte yazdıklarım:
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};
}
}
Aldığım çıktı 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Sonucumu bu web sitesinden (değerler 12/16/1984 07:45:55
ve 09/09/2014 19:46:45
) kontrol ettim . Aşağıdaki ekran görüntüsü çıktıyı göstermektedir:
Ay değerinden sonraki alanların kodumdan yanlış geldiğinden eminim. Herhangi bir öneri çok yararlı olacaktır.
Güncelleme
Sonucumu başka bir web sitesinden test ettim ve aldığım sonuç farklı. İşte: İki tarih arasındaki süreyi hesapla (sonuç: 29 yıl, 8 ay, 24 gün, 12 saat, 0 dakika ve 50 saniye).
Güncelleme
İki farklı siteden iki farklı sonuç aldığım için, hesaplama algoritmamın meşru olup olmadığını merak ediyorum. Aşağıdaki iki LocalDateTime
nesneyi kullanırsam:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Sonra çıktı geliyor: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Bu linkten olmalı 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Yani algoritmanın negatif sayıları da ele alması gerekiyor.
Soru hangi sitenin bana hangi sonucu verdiğini değil, doğru algoritmayı bilmem ve doğru sonuçlara sahip olmam gerektiğini not edin.
7:45:55
ve bitiş saatlerini 19:46:45
(veya 7:46:45
PM) alırsınız . Bu iki zaman arasındaki fark 12 saat, 0 dakika ve 50 saniyedir ve asla 23 saat, 34 dakika ve 12 saniyedir. Yani hesaplama gerçekliğiniz en azından zaman kısmında doğru gibi görünüyor.
LocalDateTime
hiçbir zaman dilimini vardır, benzersiz bir cevap olmayabilir. Başlangıç ve bitiş saat dilimlerinin aynı olduğunu varsaysanız bile, 2014-09-09 gibi bazı bölgelerde Yaz Saati Uygulamasında veya Yaz Saati'nde, diğer bölgelerde ise olmayacaktır. Bu işleri bir saat kadar azaltabilir. Dolayısıyla, ikinciye olan farkı hesaplamak, bu çözümlenmedikçe anlamsızdır.
LocalDateTime
Bu sınıfın bilerek herhangi bir zaman dilimi veya UTC'den sapma kavramından yoksun olduğundan, kullanımın gerçekçi olmayan sonuçlar verdiğini anlıyor musunuz ? Gerçekçi değerler için, üzerinden bir zaman dilimini atamak ZoneId
kullanımına ZonedDateTime
.
Period.between()
yuvarlama uygulayabilir mi?