문제

다음 금요일에 어떻게 할 수 있습니까? 조다-시간 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);
    }
}

더 짧게 또는 OneLiner와 함께 할 수 있습니까?

추신 : JDKS 날짜/시간을 사용하는 것이 좋습니다. Joda-Time은 훨씬 더 나은 API입니다.

Java 8이 소개됩니다 Java.Time 패키지 (지도 시간) 더 좋습니다.

도움이 되었습니까?

해결책

Java.Time

이랑 Java.Time Java 8 이상에 내장 된 프레임 워크 (지도 시간) 당신이 사용할 수있는 TemporalAdjusters 얻기 위해 다음 또는 이전 주일.

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

다른 팁

읽기가 훨씬 쉽게 읽을 수 있습니다.

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

추신. 실제 코드를 테스트하지 않았습니다! :)

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 월 또는 <의 새로운 DateTime을 만들 것입니다.

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 Date 라이브러리를 Jodatime으로 사용할 수없는 경우 이전 Java 버전의 대부분에서 작동 해야하는 간단한 모듈로 기반 솔루션

날짜에 추가해야 할 일 수는이 공식에 의해 제공됩니다.

(7 + Calendar.Friday -YourDateAcalendar.get (Calendar.day_of_week)) % 7

또한 정적 필드 캘린더를 변경하여 일주일 동안 일주일 동안 일반화 할 수 있습니다. 아래의 일부 스 니펫 코드

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()));
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top