2013-01-18 1 views
1

알았어.이게 저를 곤란하게합니다.Android Java 캘린더 날짜 Nexus 7의 WEEK_OF_YEAR 문제 4.2

OUTPUT : (52) 2012 (12월 24일부터 12월 30일까지)

년의 52 주의 시작과 끝입니다 나는이 문자열을 만들려고 시도합니다 다음 코드가 2012 년, 월요일은 첫 번째 요일입니다. 4.1

  • 에뮬레이터 4.1
  • -

    • 넥서스 S :

      private Date getDateObject() { 
          Calendar cld = Calendar.getInstance(); 
          cld.set(Calendar.YEAR, year); 
          cld.set(Calendar.WEEK_OF_YEAR, week); 
          cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
          return cld.getTime(); 
      } 
      
      private Date getEndDateObject() { 
          Calendar cld = Calendar.getInstance(); 
      
          if (week < 52) { 
           cld.set(Calendar.YEAR, year); 
           cld.set(Calendar.WEEK_OF_YEAR, week + 1); 
          } else { 
           cld.set(Calendar.YEAR, year + 1); 
           cld.set(Calendar.WEEK_OF_YEAR, 1); 
          } 
      
          cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
          return cld.getTime(); 
      } 
      
      public String getDateRangeString() { 
          String pattern = "d MMM"; 
          SimpleDateFormat formatter = new SimpleDateFormat(pattern); 
      
          Date startDate = getDateObject(); 
          Date endDate = getEndDateObject(); 
      
          String startDateFormatted = formatter.format(startDate); 
          String endDateFormatted = formatter.format(endDate); 
      
          String dateString = "" + this.week + ". " + this.year + " (" + startDateFormatted + " to " + endDateFormatted + ")"; 
          return dateString; 
      } 
      

      = 2012 WEEK = 52 YEAR 가진 개체에서 사용 함수 getDateRangeString 기기는 다음에 다음 출력을 제공 에뮬레이터 4.2

    OUTPUT : 52. 2012 (2 12 월 4 일 ~ 12 월 30 일)

    어느 쪽이 맞나요?

    그러나 넥서스 7을 실행 4.2.1에

    내가 얻을 :

    OUTPUT : (52) 2012 (1월 6일부터 12월 24일까지)

    WTF를!?!?

    모든 장치는 Australian EST +10으로 설정되어 있으며 현재 정확한 시간/날짜를 가지고 있습니다. 4.2.1에서 수정해야하는 4.2의 12 월 누락과 관련이 없다고 생각합니다.

    디버깅 할 때 캘린더에 올바른 값이 모두 있다고 표시됩니다. 그러면 1 월 6 일이 끝납니다.

    나는 12 월 31 일이 53 번째 주 같은 무엇인가라는 별난 것을 의미합니까? 나는 왜이 장치가 어떤 식 으로든 왜 다른지 알지 못한다.

  • +1

    캘린더 API가 매우 혼란 스럽습니다. 대신 Joda-Time을 사용하는 것이 좋습니다. – dd619

    +0

    코드가 다소 혼란 스럽습니다. 거기에 숨겨진 버그가 있습니다. 시작일까지 6 일을 추가하지 않는 이유는 명확하지 않습니다 (DST 문제를 피하려면 '캘린더'에있는 동안). 다른 출력을 설명하기 위해 작업 장치와 작동하지 않는 장치 모두에서'Calendar.getMinimalDaysInFirstWeek'를 살펴볼 수 있습니다. –

    답변

    2

    오케이, Jon Skeet에게 여러 가지 문제를 피하기 위해 6 일을 추가하는 제안에 감사드립니다. 그것이 확실히가는 길입니다.

    나중에 참조 할 수 있도록 Java 달력/날짜를 수정하지 마십시오. 하지만 실수로 모든 장치/플랫폼에서 작동하는 코드가 있습니다.

    private Date getDateObject() { 
        Calendar cld = Calendar.getInstance(); 
        cld.set(Calendar.YEAR, year); 
        cld.set(Calendar.WEEK_OF_YEAR, week); 
        cld.get(Calendar.DAY_OF_WEEK); // WARNING this line is required to make the code work. Might have something to do with an inner function called complete which gets called on get. 
        cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
        return cld.getTime(); 
    } 
    
    private Date getEndDateObject() { 
        Date endDateObject = getDateObject(); 
        long timeMilliseconds = endDateObject.getTime(); 
        long sixDaysMilliseconds = 60 * 60 * 24 * 6 * 1000; 
        endDateObject.setTime(timeMilliseconds + sixDaysMilliseconds); 
        return endDateObject; 
    } 
    

    는 게터 그들에게 다음 보너스 포인트 달력의 출력을 초래 왜 사람이 설명 할 수있는 경우 라인

    cld.get(Calendar.DAY_OF_WEEK); 
    

    에 특별한주의를 지불 :

    여기 내 수정 된 코드입니다. 하지만 미안해......... 이것에 비틀 거린 유일한 이유는 Log.i에 들어가서 코드가 모든 장치에서 작동하고 있다는 것이 었습니다. 그런 다음 정리하고 디버깅을 모두 제거하고 코드를 주석 처리하면 작업이 중단됩니다.그래서 나는 결국 그것을 getter에게 가져다 주었다. 만약 내가 그 라인에 대한 코멘트가 틀렸다면 틀린 것이고, 더 나쁜 것은 ..... 로깅이 다른 년과 주 .....를 사용하고 있음을 보여 주지만 달력에 대한 모든 호출은 같은 날짜/시간을 반환합니다. 즉, 제안 된대로 Java Date를 사용하지 마십시오.

    그러나 이전 버전을 사용하는 경우 4.2.1의 Nexus 7이 마지막 주에 다른 날짜를 반환하는 이유는 여전히 설명되지 않습니다. 아마도 내 4.2 에뮬레이터와 Nexus 7 4.2.1간에 차이가 있다는 가정을 할 수는 있지만 가능성은 희박합니다.

    적게, 6 일 추가 방법을 사용하면 가장 안전하고 보드 전반에 걸쳐 작동합니다.

    다음 번에는 Joda Time을 사용 하겠지만 지금 당장 사용 방법을 알아낼 시간이 없습니다.

    도움을 주신 모든 분들께, 이것은 여전히 ​​두 가지면에서 이상한 신비입니다.

    • 왜 게터가 캘린더 기능의 출력을 변경합니까? 내 추측은 내부적으로 호출하는 완전한 방법과 관련이 있습니다. 그러나 나는 그 문서에 언급되어 있지만 완전한 자기 자신을 부를 수는 없다.

    • 캘린더 기능에 동일한 매개 변수가 입력되면 넥서스 7 4.2.1이 다른 모든 기기/에뮬레이터와 다른 주를 얻는 이유는 무엇입니까?

    이상한.