Potrzebuję programu Java, który oblicza dni między dwiema datami.
- Wpisz pierwszą datę (notacja niemiecka; ze spacjami: „dd mm rrrr”)
- Wpisz drugą datę.
- Program powinien obliczyć liczbę dni między dwiema datami.
Jak uwzględnić lata przestępne i czas letni?
Mój kod:
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class NewDateDifference {
public static void main(String[] args) {
System.out.print("Insert first date: ");
Scanner s = new Scanner(System.in);
String[] eingabe1 = new String[3];
while (s.hasNext()) {
int i = 0;
insert1[i] = s.next();
if (!s.hasNext()) {
s.close();
break;
}
i++;
}
System.out.print("Insert second date: ");
Scanner t = new Scanner(System.in);
String[] insert2 = new String[3];
while (t.hasNext()) {
int i = 0;
insert2[i] = t.next();
if (!t.hasNext()) {
t.close();
break;
}
i++;
}
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert1[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert1[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert1[2]));
Date firstDate = cal.getTime();
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert2[0]));
cal.set(Calendar.MONTH, Integer.parseInt(insert2[1]));
cal.set(Calendar.YEAR, Integer.parseInt(insert2[2]));
Date secondDate = cal.getTime();
long diff = secondDate.getTime() - firstDate.getTime();
System.out.println ("Days: " + diff / 1000 / 60 / 60 / 24);
}
}
java
date-arithmetic
user3025448
źródło
źródło
mm
iMM
: POdpowiedzi:
AKTUALIZACJA: Oryginalna odpowiedź z 2013 roku jest już nieaktualna, ponieważ niektóre klasy zostały zastąpione. Nowym sposobem na to jest użycie nowych
java.time
klas.Zwróć uwagę, że to rozwiązanie poda liczbę rzeczywistych 24-godzinnych dni, a nie liczbę dni kalendarzowych. W tym drugim przypadku użyj
Oryginalna odpowiedź (nieaktualna od wersji Java 8)
Dokonujesz pewnych konwersji za pomocą swoich ciągów, które nie są konieczne. Jest do tego
SimpleDateFormat
klasa - spróbuj tego:EDYCJA: Ponieważ toczyły się dyskusje na temat poprawności tego kodu: rzeczywiście uwzględnia on lata przestępne. Jednak
TimeUnit.DAYS.convert
funkcja traci precyzję, ponieważ milisekundy są konwertowane na dni (zobacz połączony dokument, aby uzyskać więcej informacji). Jeśli jest to problem,diff
można również przekonwertować ręcznie:Zauważ, że jest to
float
wartość, niekoniecznieint
.źródło
String inputString1 = "28 2 2016"; String inputString2 = "1 3 2016";
: 2Najprostszy sposób:
źródło
getDifferenceDays(11PM, 4 AM nextday) == 0
W Javie 8 można to osiągnąć za pomocą
LocalDate
iDateTimeFormatter
. Z Javadoc zLocalDate
:Wzór można skonstruować za pomocą
DateTimeFormatter
. Oto Javadoc i odpowiednie znaki wzorca, których użyłem:Oto przykład:
Przykładowe wejście / wyjście z nowszym ostatnim:
Z nowszymi pierwszymi:
Cóż, możesz to zrobić jako metodę w prostszy sposób:
źródło
Większość odpowiedzi spowodowała problemy, gdy nadszedł czas letni. Oto nasze rozwiązanie robocze dla wszystkich dat, bez korzystania z JodaTime. Wykorzystuje obiekty kalendarza:
źródło
Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone();
wierszy, ponieważ zapewniają, że oryginalne wartości kalendarza nie zostaną nadpisane. Usunąłem te wiersze, uważając je za zbędne i zmarnowałem godzinę na fakt, że wartości mojego oryginalnego obiektu były nadpisywane z poziomu tej funkcji.Najlepszy sposób, a jako bonus zamienia się na String;)
źródło
Posługiwać się:
źródło
Biblioteki dat Java są notorycznie zepsute. Radziłbym użyć Joda Time . Zadba o rok przestępny, strefę czasową i tak dalej.
Minimalny przykład pracy:
źródło
withZone( DateTimeZone.forID( "Europe/Berlin" ) )
. (b) Po co używaćLocalDate
wdaysBetween
rozmowie? Po prostu przekaż obiekty DateTime (firstTime, secondTime). Dzwoń przez całe dniwithTimeAtStartOfDays
. (c)firstDateTime
Zamiast tego użyłbym nazw zmiennych ,firstTime
aby uniknąć niejednoznaczności między obiektami daty, godziny i daty i godziny. (d) Dodaj trochę try-catch, aby obsłużyć błędne dane wejściowe, które nie pasują do naszego oczekiwanego formatu.źródło
Kiedy uruchamiam twój program, nawet nie doprowadza mnie to do punktu, w którym mogę wprowadzić drugą datę.
Jest to prostsze i mniej podatne na błędy.
źródło
źródło
źródło