2011-01-09 2 views
20

이 코드는 월요일부터 금요일까지 현재 주간의 날짜를 인쇄합니다. 그것은 잘 작동하지만 다른 것을 물어보고 싶습니다 : 오늘이 토요일이나 일요일이면 다음 주를 보여주고 싶습니다. 어떻게해야합니까?토요일/일요일 확인 방법?

여기에 (감사!에 StackOverflow에) 지금까지 내 작업 코드입니다 :

// Get calendar set to current date and time 
Calendar c = Calendar.getInstance(); 

// Set the calendar to monday of the current week 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 

// Print dates of the current week starting on Monday to Friday 
DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy"); 
for (int i = 0; i <= 4; i++) { 
    System.out.println(df.format(c.getTime())); 
    c.add(Calendar.DATE, 1); 
} 

감사합니다 많이! 나는 시간에 대한 솔루션을 찾고 있었어요 나는 정말 당신이 만약/다음/다른 사람을 대체 할 수있는 귀여운 싶은 경우

답변

23
public static void main(String[] args) { 
    Calendar c = Calendar.getInstance(); 
    // Set the calendar to monday of the current week 
    c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 

    // Print dates of the current week starting on Monday to Friday 
    DateFormat df = new SimpleDateFormat("EEE dd/MM/yyyy"); 
    for (int i = 0; i <= 10; i++) { 
     System.out.println(df.format(c.getTime())); 
     int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); 
     if (dayOfWeek == Calendar.FRIDAY) { // If it's Friday so skip to Monday 
      c.add(Calendar.DATE, 3); 
     } else if (dayOfWeek == Calendar.SATURDAY) { // If it's Saturday skip to Monday 
      c.add(Calendar.DATE, 2); 
     } else { 
      c.add(Calendar.DATE, 1); 
     } 

     // As Cute as a ZuZu pet. 
     //c.add(Calendar.DATE, dayOfWeek > Calendar.THURSDAY ? (9 - dayOfWeek) : 1); 
    } 
} 

출력

Mon 03/01/2011 
Tue 04/01/2011 
Wed 05/01/2011 
Thu 06/01/2011 
Fri 07/01/2011 
Mon 10/01/2011 
Tue 11/01/2011 
Wed 12/01/2011 
Thu 13/01/2011 
Fri 14/01/2011 
Mon 17/01/2011 

... 그것을 감사

c.add(Calendar.DATE, dayOfWeek > 5 ? (9 - dayOfWeek) : 1); 

하지만 실제로 쉽게 이해하고 읽을 수있는 콘텐츠가 필요했습니다.

+0

답장을 보내 주셔서 감사합니다. 만약 내가 그것을 실행한다면 그것은 요일이 2라고 (일요일에 여기에있다). 그래서 그것을 위해 넣었습니다 그리고 월요일부터 3시 시작합니다 .... 맞습니까? – Cristian

+0

많은 분들께 감사드립니다 !!!!! – Cristian

+6

'dayOfWeek == 6'등보다 'dayOfWeek == Calendar.FRIDAY'를 사용 하시겠습니까? –

7

TL; DR

핵심 코드 개념 :

EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY) 
     .contains( 
      LocalDate.now(ZoneId.of("America/Montreal")) 
        .getDayOfWeek() 
     ) 

java.time

현대적인 방법은 java.time 클래스와 함께입니다.

DayOfWeek enum은 월요일부터 일요일까지 7 개의 개체를 제공합니다.

LocalDate 클래스는 time-of-day 및 시간대가없는 날짜 전용 값을 나타냅니다.

날짜를 결정하는 데 시간대가 중요합니다. 어떤 주어진 순간에, 날짜는 지구에 따라 지역마다 다릅니다. 예를 들어, 자정 몇 분 후 Paris France은 새로운 날이며, 어제는 "Montréal Québec"입니다.

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 
DayOfWeek dow = today.getDayOfWeek(); 

DayOfWeek 개체로 주말을 정의하십시오. EnumSetDayOfWeek과 같은 Enum 개 개체를 보유하도록 설계된 Set의 특히 빠르고 메모리가 적은 구현입니다.

Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY); 

이제 우리는 오늘이 평일인지 주말인지를 테스트 할 수 있습니다.

Boolean todayIsWeekend = weekend.contains(dow); 

질문은 이번 주말이면 다음 주에 시작하겠습니다. 그렇게하려면 날짜 시간 객체를 조작 할 수있는 클래스를 제공하는 TemporalAdjuster을 사용하십시오. java.time에는 immutable objects이 있습니다. 즉, 원래 개체를 변경 ("변경")하지 않고 기존 개체의 값을 기반으로 새 인스턴스를 생성합니다. TemporalAdjusters 클래스 (복수형에주의)는 TemporalAdjuster (next(DayOfWeek) 포함)의 편리한 구현을 제공합니다.

DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ; 
LocalDate startOfWeek = null ; 
if(todayIsWeekend) { 
    startOfWeek = today.with(TemporalAdjusters.next(firstDayOfWeek)); 
} else { 
    startOfWeek = today.with(TemporalAdjusters.previousOrSame(firstDayOfWeek)); 
} 

주말 정의가 변경되는 경우를 대비하여 해당 주간의 길이를 소프트 코딩합니다.

LocalDate ld = startOfWeek ; 
int countDaysToPrint = (DayOfWeek.values().length - weekend.size()); 
for(int i = 1 ; i <= countDaysToPrint ; i++) { 
    System.out.println(ld); 
    // Set up the next loop. 
    ld = ld.plusDays(1); 
} 

live code in IdeOne.com을 참조하십시오. java.time

소개


java.time 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 java.util.Date, Calendar, & SimpleDateFormat과 같이 문제가있는 이전 legacy 날짜 - 시간 클래스를 대체합니다.

Joda-Time 프로젝트는 지금 maintenance mode에, java.time로 마이그레이션을 조언한다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

  • Java SE 8SE 9 이후
    • 내장한다.
    • 번들로 구현 된 표준 Java API의 일부입니다.
    • Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
  • Java SE 6 및 java.time 기능의 대부분
  • Android
    • ThreeTenABP 프로젝트 적응 ThreeTen - 백 포트 구체적 안드로이드 (상술 한).
    • How to use…을 참조하십시오.

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다. 여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.