時間:次の金曜日を取得する方法?
質問
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です。
他のヒント
はるかに読みやすい方法で行うことができます:
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。実際のコードをテストしませんでした! :)
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);
}
ややテスト済み;-)
これを自分で理解しようとして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;
}
ここで、曜日の部分(LocalDateが)を作成する必要があります。
Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY);
現在、パーシャルの最も重要なフィールドは、現在の日付がそれより後(現在)であれば、+ 1になります。
つまり、2012年3月でパーシャルを作成すると、2013年3月または<!> lt;の新しい日時が作成されます。
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
}
バイト数のカウント@fvuの回答は、さらに短くすることができます:
private LocalDate calcNextFriday(LocalDate d) {
return d.plusWeeks(d.getDayOfWeek() < DateTimeConstants.FRIDAY ? 0 : 1).withDayOfWeek(DateTimeConstants.FRIDAY);
}
Javaバージョンをjava8以降にアップグレードすることが許可されていない場合、または標準のJava日付ライブラリをjodatimeとして使用することが許可されていない場合に、以前のJavaバージョンのほとんどで機能するシンプルなモジュロベースのソリューション
日付に追加する日数は次の式で与えられます:
(7 + Calendar.FRIDAY-yourDateAsCalendar.get(Calendar.DAY_OF_WEEK))%7
また、静的フィールドCalendar.FRIDAYを特定の曜日に変更することにより、これを任意の曜日に一般化できることに注意してください。以下のスニペットコード
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()));
}
}