본문 바로가기
Android 개발/Java, Java8

Java, Android 에서 날짜 표현할 때 Calendar, Date 그리고 SimpleDateFormat

by Developer88 2018. 12. 11.
반응형

안드로이드 앱을 만들다 보면, 날짜를 알아와야 할 때가 종종 있습니다.

 

이 때, 자바의 클래스중 어떤 걸 써야했는지 가물가물 할 때가 있는데요,

SimpleDateFormat 클래스와 Date클래스에 Calendar클래스 까지 있는데요.

이들을 이용해서 날짜를 얻어와 보겠습니다.

 

 

1. 클래스 소스보기

 

SimpleDateFormat과 Date, Calendar클래스의 소스 코드 설명을 보면서 어떤 클래스들인지 한번 쓰윽 보도록 하겠습니다.

 

SImpleDateFormat은 DateFormat클래스를 상속받고 있네요.

흥미로운 점은, 다른쓰레드에서는 다른 객체를 사용하라고 되어있네요.

Thread-Safe하지 못하다는 점이 마음에 좀 걸리지요. 주의해서 써야할 것 같습니다.

 

 

 

SimpleDateFormat의 pattern만을 받는 생성자는,

주어진 패턴과 default locale을 사용하고 있습니다.

Locale을 지정해서 넘겨주면, 지정된 언어의 형태로 넘겨줄 수 있습니다.

 

 

 

이번에는, Date 클래스를 보겠습니다. 

현재시간으로 Date객체를 초기화 해준다는 군요.

현재의 날짜를 얻어올 때는 new Date()하면 간단하게 얻어올 수 있겠네요.

 

 

 

 

 

Calendar 클래스도 보시죠.

Serializable과 Comparable을 implement하고 있구요.

Calendar클래스는 Milliseconds와 Month, Hour같은 local fields로 시간을 표현한다는 설명도 있군요.

 

 

 

 

Calendar클래스는 추상클래스여서, 객체를 직접 생성할 수 없습니다.

대신 getInstance메소드를 통해서 객체를 생성할 수 있는데요. 시스템의 시간과 locale을 기준으로,

Calendar객체를 가질 수 있습니다.

 

 

 

간단하게 SimpleDateFormat과 Date, Calendar를 알아보았구요.

이제, 이 Class들을 이용해서, 날짜를 출력해 보겠습니다.

 

 

2. Date클래스로 오늘 날짜 출력

 

위에서 살펴본 두 클래스를 가지고,

원하는 형태로 오늘 날짜를 출력하려고 하는데요.

 

이를 위해서, StringDateFormat에 패턴을 넣어주고,

format이라는 메소드에 인자로 새로운 Date객체를 넘겨주어 

오늘 날짜가 저희가 주어진 패턴에 맞추어 나올수 있도록 하면 됩니다.

 

많이 쓰는 것을 기준으로 패턴 몇가지를 정리해보면,

y는 년도, d는 날짜이고,  M은 월입니다.

 

h는 시간(12시간제), H도 시간(24시간제), m은 분입니다. s는 초 이구요.

 

yyyy하면 4자리수로 연도를 표기하고, dd는 두자리수이겠지요.

 

다양한 pattern에 대해서는, 아래에 Java공식 문서도 참조해주시구요.

>> 공식 문서에 있는 Customized Date and Time Pattern 

 

안드로이드에도 관련한 문서를 제공하고 있습니다.

이것은 아래 링크를 참조해 주세요.

>> 안드로이드 공식문서의 Data and Time Pattern

 

위의 패턴을 참고해서, 많이 사용하는 2107년 1월 1일을 한번 만들어 보겠습니다.

 

 

이렇게 해서 얻은 today텍스트를 가지고 유아이에 적용시키거나, 포맷을 조금 바꾸어서, yyyyMMddHHmmss같은 형태의 임시적인 캐쉬파일명으로 쓴다거나 할 수 있습니다~ .

 

 

3. Calendar클래스를 이용해서 내일, 내일모래를 출력

 

이번에는, 내일과 내일모래를 출력해 보겠습니다.

Calendar클래스를 사용해 볼텐데요.

getInstance메소드를 사용해서 Calendar객체를 얻어오구요.

 

Calendar객체의 멤버메소드인 add()를 이용해서,

파란색으로 하일라이트 된것과 같이 DAY_OF_WEEK로 하루를 더해주면 됩니다.

 

 

 

위의 코드를 실행하면, 오늘, 내일, 내일모래 날짜를 얻어올 수 있습니다.

반대로, 어제나 그저께 등을 구하려고 한다면, 인자에 1, 2가 아니라 -1이나 -2를 넣어주면 됩니다.

 

 

4. String으로 시간 받아와서 다른 형식으로 출력하기

 

서버라든가, 문서에서 시간을 받아와서, 다른 형식으로 출력하고 싶은 경우가 있을텐데요.

이럴때는, parse() 메소드를 사용해서, 얻어온 String 을 인자로 넘겨주고, 받아오는 format을 SimpleDateFormat의 인자로 넘겨줍니다.

예를 들어, 서버에서 받아온 값이 "12-02 오전 12:30"형태라면, 아래 이미지와 같이 인자로 format을 넣어주고,

parse함수에 인자로 서버에서 받아온 string값을 넣어주면, Date타입의 값을 return받게 됩니다.

 

이제 이 값은 Date타입이므로, 위에서 정리한 방법을 이용해서,

다시 원하는 형식의 String으로 출력이 가능해 지겠지요.

 

 

 

5. 시간차이 알아내기

 

시간차이를 알아내는 방법도 알아보도록 하겠습니다.

방법은 간단한데요. Date객체에 getTime()메소드로 millisecond단위의 시간을 얻어와 둘의 차이를 아래와 같이 비교해 주기만 하면 됩니다.

아래에서는 1시간 이내인지를 체크하고 있습니다.

한가지 주의할 점은, string을 parse해서 쓴 Date객체의 경우, year를 설정해 주지 않으면, 1970을 기준으로 하게 된다는 점 인데요.

아무생각없이, 가장 최근 연도로 지정될 것이라고 생각해서 코딩하면 버그를 만들게 되겠지요.

 

 

 

 

이상으로 시간에 관련된 Java의 클래스들을 정리해 보았구요.

더 좋은 방법이 있다면 이 글을 통해서 정리해 보도록 하겠습니다.

 

 

728x90

댓글