wake-up-neo.com

Zeit: Wie komme ich zum nächsten Freitag?

Wie bekomme ich den nächsten Freitag mit der Joda-Time API?.

Die LocalDate von heute ist today. Es scheint mir, Sie müssen entscheiden, 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);
    }
}

Kann man es kürzer oder mit einem Oneliner machen?

PS: Bitte raten Sie mir nicht, Datum und Uhrzeit von JDK zu verwenden. Joda-Time ist eine viel bessere API.

Java 8 führt das Java.time - Paket ( Tutorial ) ein, was noch besser ist.

50
michael.kebe

Java.time

Mit dem in Java 8 und höher ( Tutorial ) integrierten Java.time - Framework können Sie TemporalAdjusters verwenden, um next oder zurückday-of- Woche .

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

Es ist möglich, es viel einfacher zu lesen:

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! :)

52
Esko

Ihr Code in einer 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 ;-)

5
fvu
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
}
4
dinesh pazani

Ich habe nur 30 Minuten damit verschwendet, das selbst herauszufinden, aber ich musste generisch nach vorne rollen.

Jedenfalls ist 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 einen Partial (was LocalDate ist) für den Wochentag erstellen. 

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

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

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

4
Adam Gent

das Zählen von Bytes @fvu kann noch weiter verkürzt werden auf:

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

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

Die Anzahl der Tage, die Sie Ihrem Datum hinzufügen möchten, 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 an Ihren angegebenen Wochentag ändern. Einige Code-Ausschnitte 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()));
    }
}
0
Breton F.