ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • 구조화된 동시성
  • nGrinder
  • querydsl
  • AccessDecisionManager
  • LocalDateTime
  • restdocs enum
  • 동일성
  • AccessDecisionVoter 커스텀
  • 정규표현식
  • AuthenticationException
  • 동등성
  • jpa
  • nginx basic auth
  • 동시성 제어
  • 가상 스레드
  • 인가(Authorization) 처리
  • DataJpaTest
  • node exporter basic auth
  • StructuredConcorrency
  • VirtualThread Springboot
  • FilterSecurityInterceptor
  • tree
  • scope value
  • java
  • UserDetailsService
  • 트랜잭션
  • junit5
  • 가상 스레드 예외 핸들링
  • mysql
  • restdocs custom

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

Java/time

Java time 패키지 - Calendar와 Date

2022. 12. 8. 23:11

1. Calendar 와 Date

  • Date는 JDK1.0, Calendar는 JDK1.1 부터 제공되었다.
  • JDK1.8부터 java.time 패키지로 Calendar와 Date의 단점을 개선한 클래스들이 추가되었다.
  • Calendar는 추상클래스라서 객체를 직접 생성할 수 없고, 메소드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.
// 에러. 추상클래스는 인스턴스를 생성할 수 없다.
Calendar cal = new Calendar(); 

// 굿. getInstance()는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환
Calendar cal = Calendar.getInstance();
  • Calendar.getInstance() 가 static인이유
    • Calendar는 추상클래스
    • 메소드 내의 코드에서 인스턴스 변수를 사용하거나 인스턴스 메소드를 호출하지 않기 때문
    • Canlender 내부에서 TimeZone과 Locale을 이용하는 createCalendar()가 Canlender를 생성한다
    • 구현체로 GregorianCalendar와 BuddhistCalendar(불교에서 사용하는 연대 표기법) 등을 제공한다
  • GregorianCalendar: 양력, 그레고리력.
    • 태국을 제외한 나라에서 사용
    • https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html

 

1.1. Calendar 와 Date 간 변환

  • Calendar가 추가되면서 Date는 대부분의 메소드가 deprecated 되었다.
  • //1. Calendar를 Date로 변환 Calendar cal = Calendar.getInstance(); ... Date date = new Date(cal.getTimeInMillis()); //2. Date를 Calendar로 변환 Date date = new Date(); ... Calendar cal = Calendar.getInstance(); cal.setTime(d);
  • get(Calendar.MONTH)로 얻어오는 값은 1
    12가 아니라 0
    11이다.
    • 0은 1월
    • 11은 12월을 의미한다.

 

1.2. 두 날짜간의 차이 구하기

  • 두 날짜를 최소단위인 초단위로 변경한 다음 그 차이를 구한다.
  • getTimeInMillis()는 1/1000초 단위로 값을 반환한다.

 

1.3. 시간상의 전후 알기

  • 두 날짜간의 차이가 양수인지 음수인지 판단
  • boolean after(Object when) 또는 boolean before(Object when) 사용

 

1.4. 특정 날짜/시간 기준 일정 기간 전후의 날짜/시간 알기

  • add(int field, int amount) : 지정한 필드의 값 만큼 증가 또는 감소 시킨다
Date date = new Date();
date.add(Calendar.DATE, 1); // 1일 후
date.add(Calendar.DATE, -6); // 6일 전
  • YEAR, MONTH, WEEK_OF_YEAR, WEEK_OF_MONTH, DATE, DAY_OF_MONTH, DAY_OF_YEAR, DAY_OF_WEEK 등 다양하게 옵션이 상수로 정의되어 있다.
  • roll(int field, int amount) : 지정한 필드의 값을 증가 또는 감소, 다른 필드에 영향을 미치지 않음
    • Date date = new Date();
      date.roll(Calendar.DATE, 1); // 1일 후
    • add메서드로 31일 만큼 증가시키면 다음달로 넘어가지만, roll메서드로 31일만큼 증가시켜도 달에는 영향을 미치지 않음
    • add()와의 차이점은 다른 필드에 영향 미치지 않음
  • 단, Calendar.DATE가 말일일 때, roll로 Calendar.MONTH를 변경하면 Calendar.DATE 필드에 영향을 미친다.

 

1.5. 해당 월의 마지막날 알기

  • 다음 달의 1일에서 하루 빼기
  • getActualMaximum(Calendar.DATE) 사용

 

1.6. 일 수 계산

  • Calendar는 1970년 1월 1일을 기준으로 계산
  • 1970년 1월 1일 이전에 날짜에 대해 getTimeInMillis()를 호출하면 음수 반환

 

Date클래스의 기능들

boolean isLeapYear(int year) : year가 윤년이면 true 아니면 false

int dayDiff(int y1, int m1, int d1, int y2, int m2, int d2) : 두 날짜간의 차이를 일 단위로 반환

int getDayOfWeek(int year, int month, int day) : 지정한 날짜의 요일을 반환

String convertDayToDate(int day) : 일단위의 값을 년월일의 형태의 문자열로 반환

int converDateToDay(int year, int month, int day) : 년월일을 입력받아서 일 단위로 반환

 

참조

  • 자바의 정석
  • https://ryan-han.com/post/java/java-calendar-date/
저작자표시 비영리 (새창열림)

'Java > time' 카테고리의 다른 글

Java time - LocalDateTime 파싱과 포맷  (0) 2022.12.08
Java time 패키지 - TemporalAdjusters 클래스  (0) 2022.12.08
Java time 패키지 - Period, Duration 클래스  (0) 2022.12.08
Java time 패키지 - LocalDateTime, ZoneDateTime, OffsetDateTime  (0) 2022.12.08
Java time 패키지 - LocalDate, LocalTime, Instant  (0) 2022.12.08
    'Java/time' 카테고리의 다른 글
    • Java time 패키지 - TemporalAdjusters 클래스
    • Java time 패키지 - Period, Duration 클래스
    • Java time 패키지 - LocalDateTime, ZoneDateTime, OffsetDateTime
    • Java time 패키지 - LocalDate, LocalTime, Instant
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바