달력이 잘못된 달을 반환함
Calendar rightNow = Calendar.getInstance();
String month = String.valueOf(rightNow.get(Calendar.MONTH));
위의 스니펫을 실행한 후 month에는 11이 아닌 10의 값이 지정됩니다.왜?
월은 1이 아닌 0부터 지수화되므로 10은 11월, 11은 12월입니다.
0부터 시작합니다. 문서를 확인하십시오.
많은 답변에서 알 수 있듯이 월은 0으로 시작합니다.
다음 힌트를 드리겠습니다.SimpleDateFormat을 사용하여 이달의 String-representation을 취득해야 합니다.
Calendar rightNow = Calendar.getInstance();
java.text.SimpleDateFormat df1 = new java.text.SimpleDateFormat("MM");
java.text.SimpleDateFormat df2 = new java.text.SimpleDateFormat("MMM");
java.text.SimpleDateFormat df3 = new java.text.SimpleDateFormat("MMMM");
System.out.println(df1.format(rightNow.getTime()));
System.out.println(df2.format(rightNow.getTime()));
System.out.println(df3.format(rightNow.getTime()));
출력:
11
Nov
November
주의: 출력은 로케일에 따라 다를 수 있습니다.
여러 사람이 지적했듯이 Java의 Calendar 및 Date 클래스에서 반환되는 달은 1이 아닌 0부터 색인화됩니다.0은 1월이고, 현재 달인 11월은 10입니다.
당신은 왜 이런지 궁금할 것이다. 함수 「POSIX」에 .ctime
,gmtime
★★★★★★★★★★★★★★★★★」localtime
을 합니다.time_t
다음 필드를 가진 구조체(man 3 ctime부터)
int tm_mday; /* day of month (1 - 31) */
int tm_mon; /* month of year (0 - 11) */
int tm_year; /* year - 1900 */
이 API는 Java 1.0의 Java Date 클래스와 Java 1.1의 Calendar 클래스에 거의 그대로 복사되었습니다.Sun은 그들이 캘린더를 도입했을 때 가장 눈에 띄는 문제를 해결했습니다. 즉, 그레고리력으로 2001년은 날짜 클래스의 값 101로 표현되었다는 사실입니다.하지만 왜 일 및 월 값을 0 또는 1에서 적어도 둘 다 일관된 인덱스로 변경하지 않았는지 모르겠습니다.이 불일치와 관련된 혼란은 Java(및 C)에서 오늘날까지도 존재합니다.
월은 목록의 인덱스와 같이 0부터 시작합니다.
따라서 1월 = 0, 2월 = 1 등
API에서:
1년 중 첫 달은 0인 JUNE입니다.마지막 달은 1년 중 달의 수에 따라 달라집니다.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html
dr;dr
LocalDate.now() // Returns a date-only `LocalDate` object for the current month of the JVM’s current default time zone.
.getMonthValue() // Returns 1-12 for January-December.
세부 사항
다른 답변은 맞지만 구식입니다.
번거로운 오래된 날짜 수업은 디자인 선택과 결함이 많았다.하나는 명백한 1-12가 아니라 0-11 달의 숫자를 0으로 세는 것이다.
java.time
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 다음과 같은 번거로운 날짜 시간 클래스를 대체합니다.java.util.Date
,.Calendar
& , »java.text.SimpleDateFormat
현재 유지보수 모드가 되어 있는 Joda-Time 프로젝트는 java.time으로의 이행도 권장하고 있습니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.
java.time 기능의 대부분은 ThreeTen-Backport의 Java 6 및7에 백포트되며 ThreeTenABP의 Android에 더욱 적응합니다.
ThreeTen-Extra 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.
1~12개월
java.time에서 월 번호는 실제로 1월부터 12월까지 예상된 1-12입니다.
클래스는 시간대 및 시간대가 없는 날짜 전용 값을 나타냅니다.
시간대
표준 시간대는 날짜를 결정하는 데 매우 중요합니다.날짜는 지역에 따라 전 세계적으로 다릅니다.예를 들어 프랑스 파리에서는 자정 몇 분 후가 새로운 날이고 몽트레알 퀘벡에서는 여전히 "어제"입니다.
다음 형식으로 적절한 시간대 이름을 지정합니다.continent/region
, , , 등Pacific/Auckland
EST
★★★★★★★★★★★★★★★★★」IST
이는 진정한 표준 시간대가 아니며 표준화되지 않았으며 고유하지도 않기 때문입니다(!).
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
int month = today.getMonthValue(); // Returns 1-12 as values.
존의 는, 「」를 합니다.ZonedDateTime
같은 방법으로 목적하다.
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
int month = now.getMonthValue(); // Returns 1-12 as values.
레거시 클래스 변환
수중에 오브젝트가 있는 경우 로 변환합니다.ZonedDateTime
이전 클래스에 추가된 새 메서드를 사용합니다.변환에 대한 자세한 내용은 java.util 변환을 참조하십시오."java.time" 유형 날짜
ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime();
int month = zdt.getMonthValue(); // Returns 1-12 as values.
Month
참고로 java.time 클래스에는 편리한 열거형이 포함되어 있습니다.단순한 정수가 아닌 코드에서 이 클래스의 인스턴스를 사용하여 코드를 보다 자기 문서화하고, 유형 안전을 제공하며, 유효한 값을 확보하십시오.
Month month = today.getMonth(); // Returns an instant of `Month` rather than integer.
Month
enum은 현지화된 이름의 월 이름을 사용하여 String을 생성하는 등의 유용한 방법을 제공합니다.
java.time 정보
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.
현재 유지보수 모드에 있는 Joda-Time 프로젝트는 java.time 클래스로의 이행을 권장합니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.
java.time 클래스는 어디서 얻을 수 있습니까?
- 자바 SE 8, 자바 SE 9 이후
- 붙박이.
- 번들 구현이 포함된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되어 있습니다.
- 자바 SE 6 및 자바 SE 7
- java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
- 안드로이드
- 쓰리텐ABP 프로젝트는 특히 ThreeTen-Backport(상기)를 Android용으로 채택하고 있습니다.
- '쓰리텐ABP 사용방법'을 참조하십시오.
쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 등 유용한 클래스가 있습니다.
cal.get(Calendar.MONTH) + 1;
위의 문장은 정확한 월수를 알려준다.~하듯이get(Calendar.Month)
0부터 시작하는 월을 반환합니다.결과에 1을 더하면 올바른 출력이 됩니다.그리고 달을 정할 때 1을 빼야 한다는 것을 명심하세요.
cal.set(Calendar.MONTH, (8 - 1));
또는 제공된 상수 변수를 사용합니다.
cal.set(Calendar.MONTH, Calendar.AUGUST);
사용하는 것이 좋을 것 같습니다.
Calendar.JANUARY
즉 0...
언급URL : https://stackoverflow.com/questions/1755199/calendar-returns-wrong-month
'source' 카테고리의 다른 글
두 날짜 사이의 시간을 찾을 수 없습니다 MySQL (0) | 2023.01.15 |
---|---|
Python Django에서 유닛 테스트를 실행하는 동안 로깅을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.01.15 |
Python 모듈의 버전을 확인하려면 어떻게 해야 하나요? (0) | 2023.01.15 |
JavaScript를 난독화(보호)하려면 어떻게 해야 합니까? (0) | 2023.01.15 |
하위 앵커를 클릭할 때 상위 클릭 이벤트가 발생하지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.01.09 |