68

Joda-Time APIを使用して次の金曜日を取得するにはどうすればよいですか。

LocalDate今日のはtodayです。今週の金曜日の前か後のどちらにいるかを決めなければならないようです。この方法を参照してください:

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);
    }
}

短くするか、ワンライナーで行うことは可能ですか?

PS: JDK の日付/時刻の使用についてアドバイスしないでください。Joda-Time は、はるかに優れた API です。

Java 8 では、さらに優れたjava.timeパッケージ (チュートリアル) が導入されています。

4

8 に答える 8

108

java.time

Java 8 以降に組み込まれたjava.timeフレームワーク (チュートリアル) を使用すると、またはの曜日TemporalAdjustersを取得できます。

private LocalDate calcNextFriday(LocalDate d) {
  return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
}
于 2015-03-12T12:53:26.800 に答える
52

はるかに読みやすい方法でそれを行うことが可能です:

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));
}

または少し短い形式で

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
}

またはさらに短い

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

PS。私は実際のコードをテストしませんでした!:)

于 2009-10-28T09:56:04.767 に答える
5

あなたのコードを 1 行で

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

代替アプローチ

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);
}

多少テスト済み;-)

于 2009-10-28T10:06:44.037 に答える
4
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
}
于 2015-06-16T07:19:51.210 に答える
4

私はこれを自分で理解しようとして30分ほど無駄にしましたが、一般的にロールフォワードする必要がありました.

とにかくここに私の解決策があります:

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;
}

ここで必要なのは、曜日の Partial (LocalDate である) を作成することだけです。

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

パーシャルの最も重要なフィールドが何であれ、現在の日付がそれ以降 (今) の場合は +1 になります。

つまり、2012 年 3 月のパーシャルを作成すると、2013 年 3 月または < の新しい日時が作成されます。

于 2012-07-18T03:01:39.273 に答える
3

カウントバイト @fvu の回答は、次のようにさらに短縮できます。

private LocalDate calcNextFriday(LocalDate d) {
  return d.plusWeeks(d.getDayOfWeek() < DateTimeConstants.FRIDAY ? 0 : 1).withDayOfWeek(DateTimeConstants.FRIDAY);
}
于 2014-10-06T10:18:11.827 に答える