it-swarm.com.de

Wie subtrahiere ich X Tage von einem Datum mit Java calendar?

Kennt jemand eine einfache Möglichkeit, mit Java calendar X Tage von einem Datum abzuziehen?

Ich konnte keine Funktion finden, mit der ich X Tage direkt von einem Datum in Java subtrahieren kann. Kann mich jemand in die richtige Richtung weisen?

168
fmsf

Entnommen aus die Dokumente hier :

Addiert oder subtrahiert die angegebene Zeit zum angegebenen Kalenderfeld, basierend auf den Regeln des Kalenders. Um beispielsweise 5 Tage von der aktuellen Uhrzeit des Kalenders abzuziehen, können Sie Folgendes aufrufen:

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).
291
Anson Smith

Sie können die Methode add verwenden und eine negative Zahl übergeben. Sie können jedoch auch eine einfachere Methode schreiben, bei der die Klasse Calendar nicht verwendet wird, beispielsweise die folgende

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

Dadurch 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 eine Subtraktion durchzuführen. Dies wäre einfacher als die "richtige" Kalenderlösung:

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

Beachten Sie, dass beide Lösungen das als Parameter übergebene Date -Objekt ändern, anstatt ein komplett neues Date zurückzugeben. Jede Funktion kann leicht geändert werden, wenn dies gewünscht wird.

38
Eli Courtwright

Ansons Antwort wird für den einfachen Fall gut funktionieren, aber wenn Sie komplexere Datumsberechnungen durchführen wollen, würde ich empfehlen, Joda Time zu überprüfen. Es wird dein Leben viel einfacher machen.

Zu Ihrer Information in der Joda-Zeit, die Sie tun könnten

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
35
Mike Deck

tl; dr

LocalDate.now().minusDays( 10 )

Besser die Zeitzone angeben.

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

Einzelheiten

Die alten Date-Time-Klassen, die mit frühen Java-Versionen gebündelt sind, wie z. B. Java.util.Date/.Calendar haben sich als lästig, verwirrend und fehlerhaft erwiesen. Vermeide sie.

Java.time

Java 8 und höher ersetzt diese alten Klassen mit dem neuen Java.time-Framework. Siehe Tutorial . Definiert von JSR 31 , inspiriert von Joda-Time und erweitert durch ThreeTen-Extra . Das ThreeTen-Backport-Projekt portiert die Klassen nach Java 6 & 7; das ThreeTenABP-Projekt nach Android.

Die Frage ist vage und nicht klar, ob sie nur ein Datum oder eine Datums-/Uhrzeitangabe erfordert.

LocalDate

Verwenden Sie für ein reines Datum ohne Uhrzeit die Klasse LocalDate . Beachten Sie, dass eine Zeitzone für die Bestimmung eines Datums wie "Heute" von entscheidender Bedeutung ist.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

Wenn Sie eine Datums-/Uhrzeitangabe gemeint haben, verwenden Sie die Klasse Instant , um einen Moment auf der Zeitachse in UTC abzurufen =. Stellen Sie von dort aus eine Zeitzone ein, um ein ZonedDateTime - Objekt zu erhalten.

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

Table of date-time types in Java, both modern and legacy.


About Java.time

Das Java.time Framework ist in Java 8 und höher. Diese Klassen ersetzen das lästige alte Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

Sie können Java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der JDBC 4.2 oder höher entspricht. Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für Java.sql.* Klassen.

Woher bekomme ich die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

13
Basil Bourque

Anstatt mein eigenes addDays zu schreiben, wie von Eli vorgeschlagen, würde ich lieber DateUtils von Apache verwenden. Dies ist besonders dann praktisch, wenn Sie es an mehreren Stellen in Ihrem Projekt verwenden müssen.

Die API sagt:

addDays(Date date, int amount)

Fügt dem Datum, an dem ein neues Objekt zurückgegeben wird, eine Anzahl von Tagen hinzu.

Beachten Sie, dass es ein neues Date -Objekt zurückgibt und keine Änderungen am vorherigen selbst vornimmt.

5
Risav Karna
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

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)

5
matt b

Dies kann auf einfache Weise folgendermaßen geschehen

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());
1
rab

Jemand hat Joda Time empfohlen, also habe ich diese CalendarDate -Klasse http://calendardate.sourceforge.net verwendet

Es ist ein etwas konkurrierendes Projekt zu Joda Time, aber viel einfacher in nur 2 Klassen. Es ist sehr praktisch und hat hervorragend funktioniert, da ich kein größeres Paket als mein Projekt verwenden wollte. Anders als bei den Gegenstücken zu Java) ist die kleinste Einheit der Tag, sodass es sich wirklich um ein Datum handelt (keine Millisekunden oder ähnliches). Sobald Sie das Datum erstellt haben, müssen Sie nur noch etwas subtrahieren wie myDay.addDays (-5), um 5 Tage zurück zu gehen. Sie können es verwenden, um den Wochentag und ähnliche Dinge zu finden. Ein anderes Beispiel:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

Und:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}
1
mikato

Eli Courtwright zweite Lösung ist falsch, es sollte sein:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());
0
user178973