Ich möchte ein Java-Programm, das Tage zwischen zwei Daten berechnet.
- Geben Sie das erste Datum ein (deutsche Notation; mit Leerzeichen: "TT MM JJJJ")
- Geben Sie das zweite Datum ein.
- Das Programm sollte die Anzahl der Tage zwischen den beiden Daten berechnen.
Wie kann ich Schaltjahre und Sommerzeit einbeziehen?
Mein Code:
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
quelle
quelle
mm
undMM
: PAntworten:
UPDATE: Die ursprüngliche Antwort von 2013 ist jetzt veraltet, da einige der Klassen ersetzt wurden. Die neue Methode besteht darin, die neuen
java.time
Klassen zu verwenden.Beachten Sie, dass diese Lösung die Anzahl der tatsächlichen 24-Stunden-Tage und nicht die Anzahl der Kalendertage angibt. Für letzteres verwenden
Ursprüngliche Antwort (veraltet ab Java 8)
Sie führen mit Ihren Strings einige Konvertierungen durch, die nicht erforderlich sind. Es gibt eine
SimpleDateFormat
Klasse dafür - versuchen Sie Folgendes:EDIT: Da es einige Diskussionen über die Richtigkeit dieses Codes gegeben hat: Es kümmert sich in der Tat um Schaltjahre. Die
TimeUnit.DAYS.convert
Funktion verliert jedoch an Genauigkeit, da Millisekunden in Tage konvertiert werden (weitere Informationen finden Sie im verknüpften Dokument). Wenn dies ein Problem ist,diff
kann es auch von Hand konvertiert werden:Beachten Sie, dass dies ein
float
Wert ist, nicht unbedingt einint
.quelle
String inputString1 = "28 2 2016"; String inputString2 = "1 3 2016";
ans: 2Einfachster Weg:
quelle
getDifferenceDays(11PM, 4 AM nextday) == 0
In Java 8 können Sie dies mit
LocalDate
und erreichenDateTimeFormatter
. Aus dem Javadoc vonLocalDate
:Und das Muster kann mit konstruiert werden
DateTimeFormatter
. Hier ist der Javadoc und die relevanten Musterzeichen, die ich verwendet habe:Hier ist das Beispiel:
Beispiel für eine Eingabe / Ausgabe mit neuerer letzter:
Mit neueren zuerst:
Nun, Sie könnten es als Methode auf einfachere Weise tun:
quelle
Die meisten / alle Antworten verursachten Probleme, als die Sommerzeit kam. Hier ist unsere Arbeitslösung für alle Daten ohne Verwendung von JodaTime. Es werden Kalenderobjekte verwendet:
quelle
Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone();
Zeilen benötigen , da sie sicherstellen, dass die ursprünglichen Kalenderwerte nicht überschrieben werden. Ich habe diese Zeilen gelöscht, weil ich sie für überflüssig hielt, und eine Stunde damit verschwendet, dass die Werte meines ursprünglichen Objekts innerhalb dieser Funktion überschrieben wurden.Der beste Weg, und es wird als Bonus in einen String umgewandelt;)
quelle
Verwenden:
quelle
Java-Datumsbibliotheken sind notorisch kaputt. Ich würde empfehlen, Joda Time zu verwenden . Es kümmert sich um Schaltjahr, Zeitzone und so weiter für Sie.
Minimales Arbeitsbeispiel:
quelle
withZone( DateTimeZone.forID( "Europe/Berlin" ) )
. (b) WarumLocalDate
imdaysBetween
Anruf verwenden? Übergeben Sie einfach DateTime-Objekte (firstTime, secondTime). Für volle Tage rufen Sie anwithTimeAtStartOfDays
. (c) Ich würdefirstDateTime
eher Variablennamen verwendenfirstTime
, um Mehrdeutigkeiten zwischen Datums-, Uhrzeit- und Datums- / Uhrzeitobjekten zu vermeiden. (d) Fügen Sie einen Try-Catch hinzu, um fehlerhafte Dateneingaben zu verarbeiten, die nicht unserem erwarteten Format entsprechen.quelle
Wenn ich Ihr Programm ausführe, komme ich nicht einmal an den Punkt, an dem ich das zweite Datum eingeben kann.
Dies ist einfacher und weniger fehleranfällig.
quelle
quelle
quelle