source

달력이 잘못된 달을 반환함

manycodes 2023. 1. 15. 17:16
반응형

달력이 잘못된 달을 반환함

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.

Monthenum은 현지화된 이름의 월 이름을 사용하여 String을 생성하는 등의 유용한 방법을 제공합니다.


java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

현재 유지보수 모드에 있는 Joda-Time 프로젝트는 java.time 클래스로의 이행을 권장합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

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

쓰리텐 엑스트라 프로젝트는 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

반응형