Zeit: Wie den nächsten Freitag zu bekommen?
Frage
Wie kann ich den nächsten Freitag mit dem Joda-Time API erhalten.
Die LocalDate
von heute today
ist . Es scheint mir, Sie müssen entscheiden, whever Sie sind vor oder nach dem Freitag der laufenden Woche. Sehen Sie 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);
}
}
Ist es möglich, es kürzer oder mit einem Einzeiler zu tun?
PS: Bitte teilen Sie mir nicht JDKs Datum / Zeit Dinge verwenden. Joda-Time ist eine viel bessere API.
Java 8 führt java.time Paket ( Tutorial ), die noch besser ist.
Lösung
java.time
Mit dem java.time Rahmen in Java gebaut 8 und höher ( Tutorial ) können Sie a href = "https verwenden <: // docs. oracle.com/javase/8/docs/api/java/time/temporal/TemporalAdjusters.html">TemporalAdjusters
next oder vorherige Tag-of-Woche .
private LocalDate calcNextFriday(LocalDate d) {
return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
}
Andere Tipps
Es ist möglich, es in eine zu tun, viel einfacher Art und Weise 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 einer etwas kürzeren 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 nicht testen den eigentlichen Code! :)
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);
}
Alternative 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; -)
Ich mag nur 30 Minuten verschwendet versuchen, dies selbst herauszufinden, aber ich brauchte, um allgemein Rolle vorwärts.
Wie auch immer, hier ist 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 auf einen Teil machen (das LOCALDATE ist) für den Tag der Woche.
Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY);
Nun, was auch immer der bedeutendste Bereich des Teils ist wird +1, wenn das aktuelle Datum nach ist es (jetzt).
Das ist, wenn Sie mit März 2012 eine Teil machen wird es ein neues Datumzeit von März 2013 oder
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
}
Bytes @fvu Antwort Zählen verkürzt werden kann noch weiter 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 dem meisten früheren Java-Versionen für den Fall funktionieren soll es nicht erlaubt ist Ihre Java-Version zu java8 oder weiter zu aktualisieren oder eine Standard-Java-Bibliothek Datum als jodatime
zu verwenden,Anzahl der Tage zu Ihrem Termin hinzufügen wird durch diese Formel:
(7 + Calendar.FRIDAY - yourDateAsCalendar.get (Calendar.DAY_OF_WEEK))% 7
Hinweis kann dies auch durch Änderung des statischen Feldes Calendar.FRIDAY zu Ihrem bestimmten Wochentag für jeden Wochentag verallgemeinert werden. Einige 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()));
}
}