2017-04-11 3 views
0

요일 (월요일, 화요일, ..)을 매개 변수로받는이 함수에서 요일을 월과 일로 지정하려는 경우 캘린더와 GregorianCalendar 그리고 나에게 여전히 오류가 발생합니다. 예를 들어 오늘 날짜를 전달하면 (2017,11,04) 오늘 5 월 목요일 화요일의 결과가 나타납니다. 코드를 남깁니다.요일에 요일이 걸림

String diaSemana (int dia, int mes, int ano) 
{ 
    String letraD=""; 
    /*Calendar c = Calendar.getInstance(); 
    c.set(ano, mes, dia, 0, 0, 0); 
    nD=c.get(Calendar.DAY_OF_WEEK);*/ 
    TimeZone timezone = TimeZone.getDefault(); 
    Calendar calendar = new GregorianCalendar(timezone); 
    calendar.set(ano, mes, dia); 
    int nD=calendar.get(Calendar.DAY_OF_WEEK); 
    Log.i("result","diaSemana: "+nD+" dia:"+dia+" mes:"+mes+ "año:" +ano); 
    switch (nD){ 
      case 0: letraD = "D"; 
       break; 
      case 1: letraD = "L"; 
       break; 
      case 2: letraD = "M"; 
       break; 
      case 3: letraD = "X"; 
       break; 
      case 4: letraD = "J"; 
       break; 
      case 5: letraD = "V"; 
       break; 
      case 6: letraD = "S"; 
       break; 
     } 

     return letraD; 
} 

Log.i이 메시지를 보여준다

diaSemana 5 디아 : 11 MES : 4 año : 2017

고마워요! 이 시도

calendar.set(ano, mes - 1, dia); 

답변

1

문제는 달이 0부터 시작이다 초기화되고 기본값으로 설정됩니다. 잘못된 날짜를 얻는다는 의미입니다.

그러나 필드를 얻으려면 올바른 작업을 수행하십시오.

참고 : 주중 일요일은 일요일에 시작됩니다. CTRL + DAY_OF_WEEK을 (를) 클릭하면 세부 정보가 표시됩니다.

/** 
* Field number for <code>get</code> and <code>set</code> indicating the day 
* of the week. This field takes values <code>SUNDAY</code>, 
* <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>, 
* <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code>. 
* 
* @see #SUNDAY 
* @see #MONDAY 
* @see #TUESDAY 
* @see #WEDNESDAY 
* @see #THURSDAY 
* @see #FRIDAY 
* @see #SATURDAY 
*/ 

그래도 GregorianCalendar를 사용하면 월요일부터 시작될 수 있습니다. 그러나 당신이주의해야 할 것은 첫째 날은 0되지 않는 것입니다, 일주일의 첫날이 일요일에 말씀입니다 1. 시작 :

/** 
* Value of the {@link #DAY_OF_WEEK} field indicating 
* Sunday. 
*/ 
public final static int SUNDAY = 1; 

월요일는 2, 등.

그러나 장치가 주중 첫날로 설정 한 내용에 따라 달라질 수 있습니다. 몇 가지 로그 태그를 추가하고 달력을 가져 오는 방법을 변경 한 후에 확인하십시오 (이 답변의 첫 번째 코드 줄을 참조하십시오)

+0

감사합니다. Log.i는 수요일에 2017/11/4을 보여 주며, 오늘은 화요일입니다. – midlab

+0

은 2017/11/4입니다. 오늘을 나타냅니다? 귀하의 코드에서 11 월 번호입니다. –

0

: 달력 변수 Othervise

Calendar calendar = GregorianCalendar.getInstance(); 

을하지 월 = 0 2월 = 1 등 사용이 :

+0

작동합니다. 문제는 스위치의 경우입니다. 1을 0, 1을 2, 2를 변경했습니다. – midlab

1

질문에 안드로이드 태그가 붙어 있으며 솔루션에 사용하는 LocalDate 클래스를 알고 있습니다. 아직 안드로이드에는 내장되어 있지 않습니다 (올 것이다). Android에서 사용하려면 ThreeTenABP를 받으십시오 (How to use ThreeTenABP in Android Project 참조). Java 8 이상에서 사용하려면 모든 기능이 기본 제공됩니다.

static Locale español = Locale.forLanguageTag("es"); 

static String diaSemana (int dia, int mes, int ano) 
{ 
    return LocalDate.of(ano, mes, dia) 
      .getDayOfWeek() 
      .getDisplayName(TextStyle.NARROW, español); 
} 

이렇게 간단할까요? 의 다음 달의 첫 번째 전체 요일로 테스트하자

for (int dia = 2; dia <= 8; dia++) { 
     System.out.format(español, "%-2s%2d%n", diaSemana(dia, 7, 2017), dia); 
    } 

이 수요일 스페인어 miércoles 비록

D 2 
L 3 
M 4 
X 5 
J 6 
V 7 
S 8 

을 인쇄, 저는 믿습니다 편지는 당신이 무엇을 요구에 동의 완벽하게 인쇄 에 대한.

Android가 아닌 프로그래머의 경우 Calendar 클래스 및 해당 하위 클래스 GregorianCalendar은 오래되었습니다. 2014 년에 Java 8을 사용하여 프로그래머가 더 잘 사용할 수있게되었습니다.다행히도 Java 6 및 7, 특히 Android로 백 포트되었습니다. 우선, 새로운 수업에는 월별 숫자에 대한 놀랄만한 놀라움이 없으며 요일의 번호 매기기에 신경 쓸 필요가 없습니다.