시간 : 다음 금요일에 어떻게 구하는가?
문제
다음 금요일에 어떻게 할 수 있습니까? 조다-시간 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입니다.
다른 팁
읽기가 훨씬 쉽게 읽을 수 있습니다.
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()));
}
}