Kennt jemand eine einfache Möglichkeit, mit Java-Kalender X Tage von einem Datum zu subtrahieren?
Ich konnte keine Funktion finden, mit der ich X Tage direkt von einem Datum in Java abziehen kann. Kann mich jemand in die richtige Richtung weisen?
java
calendar
subtraction
fmsf
quelle
quelle
java.util.Calendar
jetzt Legacy sind , werden durch die Klassen java.time ersetzt . Siehe Tutorial von Oracle .Antworten:
Aus den Dokumenten hier entnommen :
quelle
Calendar.DAY_OF_MONTH
in diesem Fall nicht verwenden , da die Rolle zwischen den Monaten nicht so verarbeitet wird, wie Sie es möchten. Verwenden SieCalendar.DAY_OF_YEAR
stattdessenSie können die
add
Methode verwenden und eine negative Zahl übergeben. Sie können jedoch auch eine einfachere Methode schreiben, die dieCalendar
Klasse nicht verwendet , wie die folgendeDadurch wird der Zeitstempelwert des Datums (Millisekunden seit der Epoche) abgerufen und die richtige Anzahl von Millisekunden hinzugefügt. Sie können eine negative Ganzzahl für den Parameter days übergeben, um die Subtraktion durchzuführen. Dies wäre einfacher als die "richtige" Kalenderlösung:
Beachten Sie, dass beide Lösungen
Date
das als Parameter übergebene Objekt ändern, anstatt ein völlig neues zurückzugebenDate
. Jede Funktion kann leicht geändert werden, um sie auf Wunsch auch andersherum auszuführen.quelle
java.util.Calendar
jetzt Legacy sind , werden durch die Klassen java.time ersetzt . Siehe Tutorial von Oracle .Ansons Antwort wird für den einfachen Fall gut funktionieren, aber wenn Sie komplexere Datumsberechnungen durchführen möchten, würde ich empfehlen, Joda Time zu überprüfen . Es wird Ihr Leben viel einfacher machen.
Zu Ihrer Information in Joda Time, die Sie tun könnten
quelle
tl; dr
Besser Zeitzone angeben.
Einzelheiten
Die alten Datums- / Uhrzeitklassen, die mit früheren Java-Versionen wie
java.util.Date
/ gebündelt sind.Calendar
, haben sich als problematisch, verwirrend und fehlerhaft erwiesen. Vermeide sie.java.time
Java 8 und höher ersetzt diese alten Klassen durch das neue java.time-Framework. Siehe Tutorial . Definiert von JSR 310 , inspiriert von Joda-Time und erweitert durch das ThreeTen-Extra- Projekt. Das ThreeTen-Backport-Projekt portiert die Klassen zurück zu Java 6 & 7; das ThreeTenABP-Projekt für Android.
Die Frage ist vage und nicht klar, ob sie nur ein Datum oder eine Uhrzeit erfordert.
LocalDate
Verwenden Sie die
LocalDate
Klasse nur für ein Datum ohne Uhrzeit . Beachten Sie, dass eine Zeitzone für die Bestimmung eines Datums wie "Heute" von entscheidender Bedeutung ist.ZonedDateTime
Wenn Sie eine Datums- und Uhrzeitangabe gemeint haben, verwenden Sie die
Instant
Klasse, um einen Moment auf der Zeitachse in UTC abzurufen . Passen Sie von dort aus eine Zeitzone an, um einZonedDateTime
Objekt zu erhalten.Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
edit: Der Parser scheint den Link zum Javadoc nicht zu mögen, also hier im Klartext:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
quelle
Anstatt meine eigenen zu schreiben,
addDays
wie von Eli vorgeschlagen, würde ich lieberDateUtils
von Apache verwenden . Dies ist besonders praktisch, wenn Sie es an mehreren Stellen in Ihrem Projekt verwenden müssen.Die API sagt:
addDays(Date date, int amount)
Fügt einem Datum, das ein neues Objekt zurückgibt, eine Anzahl von Tagen hinzu.
Beachten Sie, dass ein neues
Date
Objekt zurückgegeben wird und keine Änderungen am vorherigen selbst vorgenommen werden.quelle
Dies kann auf einfache Weise wie folgt durchgeführt werden
quelle
LocalDate
ist viel einfacher und angemessener.Jemand hat Joda Time empfohlen - ich habe diese CalendarDate- Klasse http://calendardate.sourceforge.net verwendet
Es ist ein etwas konkurrierendes Projekt für Joda Time, aber viel grundlegender in nur 2 Klassen. Es ist sehr praktisch und hat hervorragend für das funktioniert, was ich brauchte, da ich kein größeres Paket als mein Projekt verwenden wollte. Im Gegensatz zu den Java-Gegenstücken ist die kleinste Einheit der Tag, also ist es wirklich ein Datum (ohne Millisekunden oder so). Sobald Sie das Datum erstellt haben, müssen Sie nur noch myDay.addDays (-5) subtrahieren, um 5 Tage zurück zu gehen. Sie können es verwenden, um den Wochentag und ähnliche Dinge zu finden. Ein anderes Beispiel:
Und:
quelle
Ich glaube, dass mit der Klasse java.time.Instant eine saubere und nette Methode zum Subtrahieren oder Addieren einer beliebigen Zeiteinheit (Monate, Tage, Stunden, Minuten, Sekunden, ...) erreicht werden kann .
Beispiel für das Subtrahieren von 5 Tagen von der aktuellen Zeit und das Abrufen des Ergebnisses als Datum:
Ein weiteres Beispiel zum Subtrahieren von 1 Stunde und Addieren von 15 Minuten:
Wenn Sie mehr Genauigkeit benötigen, misst Instance bis zu Nanosekunden. Methoden zur Manipulation des Nanosekunden-Teils:
Beachten Sie auch, dass das Datum nicht so genau ist wie Instant.
quelle
Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
Eli Courtwright zweite Lösung ist falsch, es sollte sein:
quelle
addDays
: seine Lösung ist richtig. Wenn Sie Tage vom Datum abziehen möchten, übergeben Sie einen negativen Wert fürdays
.