Zeit: Wie bekomme ich den nächsten Freitag?

Lesezeit: 6 Minuten

Benutzer-Avatar
michael.kebe

Wie bekomme ich das am nächsten Freitag mit Joda-Zeit API.

Das LocalDate von heute ist today. Es scheint mir, dass Sie entscheiden müssen, ob Sie vor oder nach dem Freitag der aktuellen Woche sind. Siehe diese Methode:

private LocalDate calcNextFriday(LocalDate d) {
    LocalDate friday = d.dayOfWeek().setCopy(5);
    if (d.isBefore(friday)) {
        return d.dayOfWeek().setCopy(5);
    } else {
        return d.plusWeeks(1).dayOfWeek().setCopy(5);
    }
}

Geht es auch kürzer oder mit einem Einzeiler?

PS: Bitte raten Sie mir nicht, JDKs Datum/Uhrzeit-Zeugs zu verwenden. Joda-Time ist eine viel bessere API.

Java 8 wird eingeführt java.time Paket (Lernprogramm) was noch besser ist.

  • gute Frage… DateTime könnte ein gebrauchen rollForwardTo(...) Methode

    – Skaffmann

    28. Oktober 2009 um 10:00 Uhr

  • @skaffman Siehe meine generische RollForward-Antwort. Es ist nicht super duper getestet, scheint aber für mich zu funktionieren.

    – Adam Gent

    18. Juli 2012 um 3:02 Uhr

  • Eigentlich java.time nicht unbedingt besser Joda-Zeit. Jeder hat Eigenschaften, die dem anderen fehlen. Beispielsweise fehlt java.time die Interval Klasse gefunden in Joda-Time. Verwenden Sie also jedes für seine Stärken. Sie können innerhalb eines Projekts mischen und anpassen. Sei einfach vorsichtig mit deinem import Aussagen, da einige ihrer Klassen den gleichen Namen haben.

    – Basilikum Bourque

    18. April 2015 um 19:38 Uhr


Benutzer-Avatar
michael.kebe

java.time

Mit dem java.time Framework integriert in Java 8 und höher (Lernprogramm) können Sie verwenden TemporalAdjusters bekommen nächste oder früher Wochentag.

private LocalDate calcNextFriday(LocalDate d) {
  return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
}

  • Verwendet dies Joda-Zeit?

    – Christoph Francisco

    26. Mai 2016 um 16:07 Uhr

  • Nein, aber es hat sich daraus entwickelt. Hier ein Zitat von der joda time Homepage: Joda-Time ist die De-facto-Standard-Datums- und Zeitbibliothek für Java vor Java SE 8. Benutzer werden jetzt aufgefordert, auf java.time (JSR-310) zu migrieren.

    – michael.kebe

    27. Mai 2016 um 19:40 Uhr


  • FYI, die java.time Klassen sind in Java 8 und höher integriert. Ein Großteil der java.time-Funktionalität wurde in Java 6 & 7 zurückportiert ThreeTen-Backport und weiter an Android angepasst in ThreeTenABP. Siehe auch Oracle-Tutorial um mehr zu lernen.

    – Basilikum Bourque

    30. Juni 2016 um 0:33 Uhr


Benutzer-Avatar
Esko

Es ist möglich, dies auf eine viel einfacher zu lesende Weise zu tun:

if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) {
    return d.withDayOfWeek(DateTimeConstants.FRIDAY));
} else if (d.getDayOfWeek() == DateTimeConstants.FRIDAY) {
    // almost useless branch, could be merged with the one above
    return d;
} else {
    return d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY));
}

oder in etwas kürzerer Form

private LocalDate calcNextFriday(LocalDate d) {    
    if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) {
        d = d.withDayOfWeek(DateTimeConstants.FRIDAY));
    } else {
        d = d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY));
    }    
    return d; // note that there's a possibility original object is returned
}

oder noch kürzer

private LocalDate calcNextFriday(LocalDate d) {
    if (d.getDayOfWeek() >= DateTimeConstants.FRIDAY) {
        d = d.plusWeeks(1);
    }
    return d.withDayOfWeek(DateTimeConstants.FRIDAY);
}

PS. Ich habe den eigentlichen Code nicht getestet! 🙂

  • oder kompilieren Sie es … “DateTimeConstans”

    – David Viktor

    14. September 2011 um 11:53 Uhr

  • Die “return”-Zeile Ihres letzten Snippets enthält ein überflüssiges “)”-Zeichen. Trotzdem danke, tolle Lösung!

    – gyorgyabraham

    16. August 2013 um 15:32 Uhr

Ihr Code in 1 Zeile

private LocalDate calcNextFriday3(LocalDate d) {
    return d.isBefore(d.dayOfWeek().setCopy(5))?d.dayOfWeek().setCopy(5):d.plusWeeks(1).dayOfWeek().setCopy(5);
}

Alternativer Ansatz

private LocalDate calcNextDay(LocalDate d, int weekday) {
    return (d.getDayOfWeek() < weekday)?d.withDayOfWeek(weekday):d.plusWeeks(1).withDayOfWeek(weekday);
}


private LocalDate calcNextFriday2(LocalDate d) {
    return calcNextDay(d,DateTimeConstants.FRIDAY);
}

etwas getestet 😉

  • Danke für deine Antwort. Ihr Vorschlag mit dem allgemeineren Ansatz ist nett. Aber der Einzeiler ist in Bezug auf die Lesbarkeit umständlich.

    – michael.kebe

    28. Oktober 2009 um 10:27 Uhr

  • @michaelkebe du hast nach einem Einzeiler gefragt, ich habe gerade einen zur Verfügung gestellt… 😉

    – fvu

    28. Oktober 2009 um 10:39 Uhr

  • @michael.kebe Normalerweise platziere ich Zeilenumbrüche mit Ternären bei “?” und “:”, Hit-Format in Eclipse und es arrangiert ziemlich gut.

    – gyorgyabraham

    16. August 2013 um 15:51 Uhr

Benutzer-Avatar
Adam Gent

Ich habe nur ungefähr 30 Minuten damit verschwendet, das selbst herauszufinden, aber ich musste allgemein vorwärts rollen.

Trotzdem hier meine Lösung:

public static DateTime rollForwardWith(ReadableInstant now, AbstractPartial lp) {
    DateTime dt = lp.toDateTime(now);
    while (dt.isBefore(now)) {
        dt = dt.withFieldAdded(lp.getFieldTypes()[0].getRangeDurationType(), 1);
    }
    return dt;
}

Jetzt müssen Sie nur noch ein Partial (das LocalDate ist) für den Wochentag erstellen.

Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY); 

Was auch immer das signifikanteste Feld des Teils ist, wird +1 sein, wenn das aktuelle Datum danach (jetzt) ​​liegt.

Das heißt, wenn Sie einen Teil mit März 2012 erstellen, wird eine neue Datumszeit von März 2013 oder < erstellt.

Benutzer-Avatar
Dinesh Pazani

import java.util.Calendar;

private Calendar getNextweekOfDay(int weekOfDay) {
    Calendar today = Calendar.getInstance();
    int dayOfWeek = today.get(Calendar.DAY_OF_WEEK);
    int daysUntilNextWeekOfDay = weekOfDay - dayOfWeek;
    if (daysUntilNextWeekOfDay == 0) daysUntilNextWeekOfDay = 7;
    Calendar nextWeekOfDay = (Calendar)today.clone();
    nextWeekOfDay.add(Calendar.DAY_OF_WEEK, daysUntilNextWeekOfDay);
    return nextWeekOfDay;
}

// set alarm for next Friday 9am
public void setAlarm() {
    Calendar calAlarm = getNextweekOfDay(Calendar.FRIDAY);
    calAlarm.set(Calendar.HOUR_OF_DAY, 9);//9am
    calAlarm.set(Calendar.MINUTE, 0);
    calAlarm.set(Calendar.SECOND, 0);
    scheduleAlarm(calAlarm);// this is my own method to schedule a pendingIntent
}

Benutzer-Avatar
Stefan Habel

counting bytes @fvu answer kann noch weiter verkürzt werden zu:

private LocalDate calcNextFriday(LocalDate d) {
  return d.plusWeeks(d.getDayOfWeek() < DateTimeConstants.FRIDAY ? 0 : 1).withDayOfWeek(DateTimeConstants.FRIDAY);
}

Eine einfache Modulo-basierte Lösung, die mit den meisten früheren Java-Versionen funktionieren sollte, falls Sie Ihre Java-Version nicht auf Java8 oder höher aktualisieren oder eine Standard-Java-Datumsbibliothek als Jodatime verwenden dürfen

Die Anzahl der Tage, die Sie zu Ihrem Datum hinzufügen müssen, wird durch diese Formel angegeben:

(7 + Calendar.FRIDAY – yourDateAsCalendar.get(Calendar.DAY_OF_WEEK)) % 7

Beachten Sie auch, dass dies für jeden Wochentag verallgemeinert werden kann, indem Sie das statische Feld Calendar.FRIDAY in Ihren angegebenen Wochentag ändern. Etwas Snippet-Code unten

public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {

        Calendar cur = Calendar.getInstance();
        cur.add(Calendar.DAY_OF_MONTH, i);

        Calendar friday = Calendar.getInstance();
        friday.setTime(cur.getTime());
        friday.add(Calendar.DAY_OF_MONTH, (7 + Calendar.FRIDAY - cur.get(Calendar.DAY_OF_WEEK)) % 7);

        System.out.println(MessageFormat.format("Date {0} -> {1} ", cur.getTime(),  friday.getTime()));
    }
}

  • FYI, die furchtbar lästigen alten Datums-Zeit-Klassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormat sind jetzt Erbeersetzt durch die java.time Klassen, die in Java 8 und höher integriert sind. Sehen Lernprogramm von Oracle.

    – Basilikum Bourque

    30. November 2018 um 1:14 Uhr

  • Ja Wenn Sie Java 8 oder höher oder Jodatime verwenden, ist dies nichts für Sie. Ich habe es gesagt, aber ich war nicht klar. Vielen Dank für Ihren Kommentar.

    – Breton F.

    7. Dezember 2018 um 15:26 Uhr

1181290cookie-checkZeit: Wie bekomme ich den nächsten Freitag?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy