1. 클래스에서 클래스 Date로 전환Calendar

프로그래머들은 이 Date클래스의 단순성과 Unix 표준 지원을 좋아했지만 아시다시피 모든 장미에는 가시가 있습니다.

프로그래머는 "똑똑한" Date클래스를 원했습니다. 그리고 그들은 수업의 형태로 원하는 것을 얻었습니다 Calendar. 날짜를 저장하는 것뿐만 아니라 날짜로 어려운 작업을 수행하는 방법으로 생각되었습니다.

클래스 의 전체 이름은 Calendarjava.util.Calendar입니다. 코드에서 사용하기로 결정한 경우 가져오기 문에 추가하는 것을 잊지 마십시오.

Calendar다음 명령을 사용하여 개체를 만들 수 있습니다 .

Calendar date = Calendar.getInstance();

getInstance()클래스 의 정적 메서드는 현재 날짜로 초기화된 개체를 Calendar만듭니다 . Calendar프로그램을 실행하는 컴퓨터의 설정에 따라 원하는 캘린더가 생성됩니다.

더 정확히 말하면, 당신이 받는 달력은... 지구상의 인간이 하나의 달력에 국한되지 않기 때문입니다. 대신 많이 사용합니다. 그리고 그들 대부분은 어떤 종교나 국가와 연관되어 있습니다. 이 Calendar클래스는 그 중 3가지를 지원합니다.

달력 설명
그레고리 언 달력 기독교 그레고리력
불교 달력 불교 달력
일본어임페리얼달력 일본 황실 달력

그러나 중국과 아랍 달력도 있습니다. 기본적으로 시간과 함께 일하는 것은 생각만큼 쉽지 않습니다.

중국 달력에서 연도는 공식적으로 이 수업을 작성할 당시 4716년입니다. 그리고 무슬림 달력에 따르면 1398년입니다. 큰 세상에 온 것을 환영합니다, 프로그래머 친구여.

2. 달력 개체 만들기

우리는 세계에서 가장 일반적이기 때문에 그레고리력을 사용할 것입니다. 적어도 중국이 Oracle을 인수하고 중국 달력을 주요 달력으로 만들기 전까지는 말입니다.

다음과 같은 명령문을 사용하여 날짜가 있는 달력 개체를 만들 수 있습니다.

Calendar date = new GregorianCalendar(year, month, day);

GregorianCalendar예, 매번 작성해야 합니다 . 대신 을 Calendar쓸 수도 있습니다 GregorianCalendar— 그것도 작동합니다. 그러나 쓰기는 Calendar더 짧습니다.

예를 들어 2019 대신 19를 쓸 수 없습니다. 월은 여전히 ​​0부터 번호가 매겨집니다. 그러나 이전과 마찬가지로 월의 날짜는 0부터 번호가 매겨지지 않습니다. 대단하다!

시간과 날짜를 설정하려면 시간을 추가 인수로 전달해야 합니다.

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

필요한 경우 밀리초 단위로 전달할 수도 있습니다. 초 뒤에 오는 매개변수입니다.

3. 화면에 달력 개체 표시하기

단순히 달력 개체를 화면에 인쇄하면 결과가 그다지 만족스럽지 않을 것입니다.

암호
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
콘솔 출력
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

여기서 주의할 점은 달력은 날짜가 아니라 달력이라는 것입니다 . 모든 종류의 설정이 화면에 표시됩니다.

SimpleDateFormat달력을 표시하기 위해 물건을 사용하는 것이 적절하겠지만 , 우리가 그것을 연구하기 전까지는 이 생활 해킹을 사용할 수 있습니다.

Date date = calendar.getTime();

개체 Calendar는 쉽게 개체로 변환할 수 Date있으며 개체를 표시하는 방법을 이미 알고 있습니다 Date. Calendar다음과 같은 코드를 사용하여 객체를 다음으로 변환할 수 있습니다 Date.

방법 사용 getTime():

암호 콘솔 출력
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

그것은 완전히 다른 문제입니다, 그렇죠?

4. 날짜 요소 작업

날짜의 특정 요소(예: 연도, 월 등)를 가져오기 위해 클래스에 메서드가 Calendar있습니다 get(). 단일 방법이지만 다음과 같은 매개변수가 있습니다.

int month = calendar.get(Calendar.MONTH);

여기서 calendarCalendar변수이고 는 클래스 MONTH의 상수 필드입니다 Calendar.

Calendar클래스의 상수 필드 중 하나를 메서드에 대한 인수로 전달 get하고 원하는 값을 결과로 얻습니다.

암호 설명
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


시대(서력 시대 전후)




요일


날짜의 요소를 변경하려면 다음 set방법을 사용하십시오.

calendar.set(Calendar.MONTH, value);

여기서 calendarCalendar변수이고 는 클래스 MONTH의 상수 필드입니다 Calendar.

메서드 로 작업할 때 클래스의 상수 필드 중 하나를 첫 번째 인수로 set전달 하고 새 값을 두 번째 인수로 전달합니다.Calendar

암호 설명
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


연도 = 2019년
월 = 7월(0부터 시작)
넷째 날


5. Calendar클래스 의 상수

클래스 의 상수 필드는 Calendar날짜의 요소 이름 지정을 위한 필드로 제한되지 않습니다. 모든 경우에 필드가 있는 것 같습니다.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

예를 들어 월을 나타내는 상수 필드가 있습니다.

또한 요일:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

우리는 모든 것을 나열하지 않을 것입니다. 코드에서 이와 같은 상수를 보게 되더라도 놀라지 않기를 바랍니다.

상수를 사용하면 코드를 더 쉽게 읽을 수 있으므로 프로그래머가 상수를 사용합니다. 그리고 가독성을 높이기 위해 월도 0부터 번호가 매겨집니다. 아니면.

Calendar6. 개체 의 날짜 변경

클래스 Calendar에는 보다 지능적인 방식으로 날짜를 조작할 수 있는 방법이 있습니다. 예를 들어 날짜에 연도, 월 또는 며칠을 추가할 수 있습니다. 아니면 그것들을 치워버리세요. 이 방법을 이라고 합니다 add(). 그것으로 작업하는 것은 다음과 같습니다.

calendar.add(Calendar.MONTH, value);

여기서 calendarCalendar변수이고 는 클래스 MONTH의 상수 필드입니다 Calendar.

메서드 로 작업할 때 클래스의 상수 필드 중 하나를 첫 번째 인수로 add전달 하고 두 번째 인수(추가할 새 값)로 전달합니다.Calendar

이것은 또 다른 지능적인 방법입니다. 얼마나 똑똑한지 봅시다:

암호
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
콘솔 출력
Fri Mar 01 00:00:00 EET 2019

이 방법은 2019년 2월이 28일뿐임을 이해하므로 결과 날짜는 3월 1일입니다.

이제 2개월을 빼자! 우리는 무엇을 얻어야 합니까? 2018년 12월 27일! 지금 확인합시다.

이전 날짜가 되는 작업을 수행하려면 메서드에 음수 값을 전달해야 합니다 add().

암호
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
콘솔 출력
Thu Dec 27 00:00:00 EET 2018

효과가있다!

이 방법은 달의 길이와 윤년을 고려합니다. 대체로 훌륭한 방법입니다. 날짜를 다루는 대부분의 프로그래머에게 필요한 것입니다.

7. 날짜의 롤링 요소

그러나 때로는 다른 모든 항목을 변경하지 않고 날짜의 한 부분에 대해 작업을 수행하려는 경우와 같이 이러한 현명한 동작을 원하지 않는 상황이 있습니다.

클래스 에는 이를 위한 Calendar특별한 메서드가 있습니다 . roll()시그니처는 메서드와 같지만 add()이 메서드는 날짜의 한 요소만 변경하고 나머지는 변경하지 않습니다.

예:

암호
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
콘솔 출력
Fri Dec 27 00:00:00 EET 2019

월을 변경했지만 연도와 날짜는 변경되지 않았습니다.