본문 바로가기

DEVELOPMENT/JAVA

[JAVA] 날짜와 시간 & 형식

Calendar와 Date

 

Date는 날짜와 시간을 다룰 목적으로 JDK1.0부터 제공되어온 클래스이다. Date 클래스는  기능이 부족했기 때문에, 그 다음 버전인 JDK1.1부터 Calendar라는 새로운 클래스를 제공하기 시작했다. Calendar는 Date보다는 훨씬 나았지만 몇 가지 단점들이 발견되어서 JDK1.8부터 'java.time패키지'로 기존의 단점들을 개선한 새로운 클래스들이 추가되었다.

 

 

Calendar와 GregorianCalendar

 

Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

 

Calendar cal = new Calendar(); // 에러!!! 추상클래스는 인스턴스를 생성할 수 없다.

Calendar cal = Calendar.getInstance(); // getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환한다.

 

Calendar를 상속받아 완전히 구현한 클래스로는 GregorianCalendar와 BuddhistCalendar가 있는데 getInstance()는 시스템의 국가와 지역설정을 확인해서 태국인 경우에는 BuddhistCalendar의 인스턴스를 반환하고, 그 외에는 GregorianCalendar의 인스턴스를 반환한다. (※ GregorianCalendar : Calendar 클래스의 하위 클래스)

인스턴스를 직접 생성해서 사용하지 않고 이처럼 메서드를 통해서 인스턴스를 반환받게 하는 이유는 최소한의 변경으로 프로그램이 동작할 수 있도록 하기 위한 것이다. 

 

getInstance()메서드가 static인 이유는 메서드 내의 코드에서 인스턴스 변수를 사용하거나 인스턴스 메서드를 호출하지 않기 때문이며, 또 다른 이유는 getInstance()가 static이 아니라면 객체를 생성한 다음에 호출해야 하는데 Calendar는 추상클래스이기 때문에 객체를 생성할 수 없기 때문이다.

 

 

Date와 Calendar간의 변환

 

1. Calendar를 Date로 변환

Calendar cal = Calendar.getInstance();
...
Date d = new Date(cal.getTimeInMillis());

 

2. Date를 Calendar로 변환

Date d = new Date();
...
Calendar cal = Calendar.getInstance();
cal.setTime(d);

 

 

Calendar 클래스의 주요 메서드

 

메서드 설명 반환 결과
getInstance() 시스템의 현재 날짜와 시간으로 Calendar 인스턴스를 생성하여 반환한다. Calendar
get(int field) 현재 객체의 주어진 값의 필드에 해당하는 상수 값을 반환한다.이 상수값은 Calendar 클래스의 상수중에 가진다.   int
set(int field, int value)  현재 객체의 특정 필드를 다른 값으로 설정한다. void
set(int year, int month, int date) 현재 객체의 년, 월, 일 값을 다른 값으로 설정한다.  void
set(int year, int month, int date, int hour, int minute, int second)  현재 객체의 년, 월, 일, 시, 분, 초 값을 다른 값으로 설정한다.  void
getTime() 현재의 객체를 Date 객체로 변환한다. Date
setTime(Date date)  현재 객체의 특정 필드를 다른 값으로 설정한다.  void
getTimeInMillis() 1/1000초 단위로 값을 반환한다.
일단위로 얻기 위해서는 24(시간)*60(분)*60(초)*1000 으로 나누어준다.
long
setTimeInMills(long mills)  현재 객체를 1/1000초 단위의 주어진 매개변수 시간으로 설정한다.  void
add(int field, int amount) 지정한 필드의 값을 원하는 만큼 증가 또는 감소시킨다. void
roll(int field, int amount) 지정한 필드의 값을 증가 또는 감소 시킬 수 있다. 
add메서드와의 차이점은 다른 필드에 영향을 미치지 않는다.
void
after(Object when) 현재 객체가 when 이후이면 true 아니면 false를 리턴한다 boolean
before(Object when) 현재 객체가 when 이전이면 true 아니면 false를 리턴한다. boolean 
equals(Object obj) 같은 날짜값인지 비교하여 true, false를 반환한다.  boolean
getActualMaximum(int field) 현재 객체의 특정 필드의 최대 값을 반환한다. int
getActualMinimum(int field) 현재 객체의 특정 필드의 최소 값을 반환한다. int
clear(int field) Calendar객체의 특정 필드를 초기화한다. void
toString() Calendar 인스턴스에 저장된 날짜와 시간정보를 문자열로 변환하여 반환하는 메소드다. String

 

 

Calendar 클래스의 int형 상수들

 

Field(static int)
사용방법
설명
YEAR
Calendar.YEAR
현재 년도
MONTH
Calendar.MONTH
현재 월 (1월:0)
DATE
Calendar.DATE
현재 월의 날짜
WEEK_OF_YEAR
Calendar.WEEK_OF_YEAR
이 해의 몇 째 주
WEEK_OF_MONTH
Calendar.WEEK_OF_MONTH
이 달의 몇  째 주
DAY_OF_YEAR
Calendar.DAY_OF_YEAR
이 해의 몇 일
DAY_OF_MONTH
Calendar.DAY_OF_MONTH
이 달의 몇 일
DAY_OF_WEEK
Calendar.DAY_OF_WEEK
요일(1~7, 일요일:1)
DAY_OF_WEEK_IN_MONTH
Calendar.DAY_OF_WEEK_IN_MONTH
이 달의 몇 째 요일
AM_PM
Calendar.AM_PM
오전 오후(오전:0, 오후:1)
HOUR
Calendar.HOUR
현재 시간 (12시간제)
HOUR_OF_DAY
Calendar.HOUR_OF_DAY
현재 시간 (24시간제)
MINUTE
Calendar.MINUTE
현재 분
SECOND
Calendar.SECOND
현재 초
MILLISECOND
Calendar.MILLISECOND
1000분의 1초(0~999)
 
 
SimpleDateFormat

 

Date와 Calendar만으로 날짜 데이터를 원하는 형태로 다양하게 출력하는 것은 불편하고 복잡하다.

그러나 SimpleDateFormat을 사용하면 이러한 문제들이 간단히 해결된다.

SimpleDateFormat을 사용하는 방법은 먼저 원하는 출력형식의 패턴을 작성하여 SimpleDateFormat인스턴스를 생성한 다음, 출력하고자 하는 Date인스턴스를 가지고 format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻게 된다.

Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(df.format(today)); // 2022-11-19
Calendar cal = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd E");
System.out.println(df.format(cal.getTime())); // 2022-11-19 토

 

 

LocalDate와 LocalTime

 

LocalDate와 LocalTime은 java.time패키지의 가장 기본이 되는 클래스이다.

객체를 생성하는 방법은 현재의 날짜와 시간을 LocalDate와 LocalTime으로 각각 반환하는 now()와 지정된 날짜와 시간으로 LocalDate와 LocalTime객체를 생성하는 of()가 있다. 둘 다 static메서드이다.

LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();

LocalDate birthDate = LocalDate.of(2022, 11, 19);
LocalTime birthTime = LocalTime.of(17, 25, 20);

 

*LocalDate와 LocalTime의 필드의 값을 반환하는 메서드

클래스 메서드 설명 반환 결과
LocalDate getYear() 년도(1999) int
getMonthValue() 월(12) int
getMonth() 월(DECEMBER) getMonth().getValue() = 12 Month
getDayOfMonth() 일(31) int
getDayOfYear() 같은 해의 1월 1일부터 몇번째 일(365) int
getDayOfWeek() 요일(FRIDAY) getDayOfWeek().getValue() = 5 DayOfWeek
lengthOfMonth() 같은 달의 총 일수(31) int
lengthOfYear() 같은 해의 총 일수(365), 윤년이면 366 int
isLeapYear() 윤년여부 확인(false) boolean
LocalTime getHour() 시(23) int
getMinute() 분(59) int
getSecond() 초(59) int
getNano() 나노초(0) int

 

 

 

 

 

 

* 자바의 정석을 읽고 정리한 내용입니다.