시간 : 다음 주 금요일에 도착하는 방법?
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);
}
}
더 짧거나 한 줄로 할 수 있습니까?
추신 : JDK 날짜 / 시간 항목을 사용하는 것을 권하지 마십시오. Joda-Time은 훨씬 더 나은 API입니다.
Java 8에는 더 나은 java.time 패키지 ( Tutorial )가 도입되었습니다 .
java.time
으로 java.time의 자바 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);
}
추신. 실제 코드를 테스트하지 않았습니다! :)
한 줄의 코드
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;
}
이제 요일에 대해 Partial (LocalDate)을 만들어야합니다.
Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY);
이제 부분에서 가장 중요한 필드가 무엇이든 현재 날짜가 그 이후 (지금)이면 +1이됩니다.
즉, 2012 년 3 월로 부분을 만들면 2013 년 3 월 또는 <의 새 날짜 / 시간이 생성됩니다.
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 버전에서 작동하는 간단한 모듈로 기반 솔루션
Number of days to add to your date is given by this formula :
(7 + Calendar.FRIDAY - yourDateAsCalendar.get(Calendar.DAY_OF_WEEK)) % 7
Note also this can be generalized for any week day by changing the static field Calendar.FRIDAY to your given weekday. Some snippet code below
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()));
}
}
Here is my solution using calendar:
/**
* Return the next week date depending of the day in the week asked.
* dayOfWeek=1 => Monday, dayOfWeek=2 => Tuesday, ..., dayOfWeek=7 => Sunday
*/
public static Date getNextWeekDate(int dayOfWeek) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int todayDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
calendar.add(Calendar.DATE, todayDayOfWeek == 1 ? 1 : 9 - todayDayOfWeek); // Go to next Monday
calendar.add(Calendar.DATE, dayOfWeek - 1); // Go to the demanded day in the next week
return calendar.getTime();
}
ReferenceURL : https://stackoverflow.com/questions/1636038/time-how-to-get-the-next-friday
'development' 카테고리의 다른 글
패키지 이름에서 애플리케이션 아이콘을 어떻게 가져올 수 있습니까? (0) | 2021.01.05 |
---|---|
Python의 heapq 모듈은 무엇입니까? (0) | 2021.01.05 |
이전 참조자를 찾기위한 Django 요청 (0) | 2021.01.05 |
Rails 3에서 최소 / 최대 유효성 검사기를 구현하는 방법은 무엇입니까? (0) | 2021.01.05 |
iOS-모달보기가 있는지 확인하는 방법 (0) | 2021.01.05 |