생각을 개발하자, 박진형

[Java] 표준 API #5 - Calendar, Date, Format, java.time 패키지 본문

Java/java basic

[Java] 표준 API #5 - Calendar, Date, Format, java.time 패키지

imjinbro imjinbro 2017.10.19 00:13

[API 알아보기]

1) java.util.Date, java.util.Calendar

- 시스템 날짜, 시간 관련 유틸리티 객체

/*
[Date + SimpleDateFormat]
1) 시스템의 날짜, 시간을 읽을 수 있는 유틸리티
2) 날짜를 주고 받을 때 주로 사용
3) java.text.SimpleDateFormat 메서드로 특정 포맷 출력 가능 : 패턴 지정해줘야함
- Format 관련 패키지 : java.text

*/

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTest {
public static void main(String[] args) {

//다양한 생성자가 있지만 권장하지않는 어노테이션(Deprecated)가 붙어있음
Date now = new Date();
System.out.println(now.toString());

SimpleDateFormat sdf = new SimpleDateFormat("YY년 MM월 dd일 hh시 mm분");
String formatNow = sdf.format(now);
System.out.println(formatNow);


}
}


/*
[Calendar + TimeZone]
1) 날짜와 시간을 얻기위한 유틸리티
2) abstract 클래스 : 인스턴스 생성X, extends -> 구현 클래스 인스턴스 생성
- 국가, 문화, 지역마다 날짜, 시간 계산 방법이 다르기때문에 계산에 필요한 메서드, 필드만 선언되어있음 : abstract인 이유
- 하위 클래스에서 구현하도록 되어있음 : 특별한 역법 사용하지않는다면 getInstance로 Calendar 타입 인스턴스 얻을 수 있음
- getInstance 인자로 locale 지정해주면 특정 위치에 따른 시간, 포맷 설정 : Timezone 객체 사용

3) Date 와 Calendar 차이
- Date : 시스템의 시간 정보를 그대로 가져오는 목적이라면
- Calendar : 관련 값(상수 필드)을 가져와서 직접 구현
*/

import java.util.Calendar;
import java.util.TimeZone;

public class CalendarTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();

//날짜 계산에 필요한 필드는 static final int로 선언
System.out.println(cal.get(Calendar.DAY_OF_MONTH));
System.out.println(cal.get(Calendar.HOUR));
System.out.println(cal.get(Calendar.AM_PM)); // AM: 0, PM: 1

/* 요일마다 이벤트! */
int week = Calendar.DAY_OF_WEEK;
switch (week){
case Calendar.MONDAY:

break;

case Calendar.TUESDAY:

break;

case Calendar.WEDNESDAY:

break;
}

/* 시스템 변경 없이 : 사용 가능한 로케일 리스트 요청 */
String[] list = TimeZone.getAvailableIDs();
for(String element : list){
System.out.println(element);
}

//Date 인스턴스 얻는 getTime()을 쓰면 시스템 시간을 얻어옴
Calendar rome = Calendar.getInstance(TimeZone.getTimeZone("Europe/Rome"));
//System.out.println(rome.getTime()); (x)
System.out.println(rome.get(Calendar.HOUR));
}
}


2) java.text.Format

- abstract 클래스 : Format 구현하는 각종 클래스 - 포맷팅과 관련한 객체타입

(1) DecimalFormat

(2) SimpleDateFormat

(3) MessageFormat


- 포맷팅 관련 인터페이스가 있다는 점을 알아두자

public class SimpleDateFormatTest {
public static void main(String[] args) {

/*
인스턴스 생성 시 포맷 패턴
1) y: 년
2) M: 월
3) d: 일
4) D: 일(365일)
5) E: 요일
6) a: 오전/오후
7) H: 시(24시간제)
8) h: 시(12시간제)
9) m: 분
10) s: 초

그 외 년의 몇번째 주, 월의 몇번째 주 등이 있음

*/
String[] pattern = {
"yy년 M월 d일 H시 m분",
"D번째 날"
};

SimpleDateFormat sdf = null;
Date now = null;
for(int i=0; i<pattern.length; i++){
sdf = new SimpleDateFormat(pattern[i]);
now = new Date();

System.out.println(sdf.format(now));
}

}
}
/*
- 문자열 형식 포맷팅하기
- 네트워크할 때는 json이지! : gson을 쓰자! 간단하게 json으로 포맷팅해준다! 역포맷팅도 된다!
- SQL문 작성할 때 편하겠음

*/

import java.text.MessageFormat;

public class MessageFormatTest {
public static void main(String[] args) {
String id = "1234";
String name = "박진형";

String txt = "회원 ID : {0} \n회원 이름 : {1}";
String msg = MessageFormat.format(txt, id, name);
System.out.println(msg);
}
}
import java.text.DecimalFormat;

public class DecimalFormatTest {
public static void main(String[] args) {
/*
- 다양한 숫자 관련 포맷
1) 통화 기호 : 유니코드 + 단위 표현
*/
double num = 12345.67;
DecimalFormat df = null;
String[] pattern = {
"0", "0.0", "#,###",
"\u00A4 #,###"
};


for(int i=0; i<pattern.length; i++){
df = new DecimalFormat(pattern[i]);
System.out.println(df.format(num));
}
}
}



3) java.time : java8~

- 시간, 날짜 관련한 객체 타입 패키지

- 정보 얻기, 설정, 연산, 파싱 모두 모여있음

- java8부터 새롭게 생긴 API 패키지

/*
- 날짜와 시간과 관련해서 권장하지않는 방법을 대체하고 기능을 확장한 새로운 패키지
- 정보 얻기 + 세팅(변경) + 연산 + 파싱 모두 한 패키지 내에 있음 : 이전에는 각각 패키지에 있었던 것들을 모아놓음
- 파싱해서 타입 변환시킴 : 타입의 메서드 사용
(1) TimeFormat : http://docs.oracle.com/javase/8/docs/api/ DateTimeFormatter 참고
(2) 사용자 지정 포맷을 사용해도 됨
(3) 특정 타입으로 변환시키는 것은 특정 타입이 가지는 메서드를 사용하기위해서
(4) 특정 타입을 String으로 변환시킬 수 있음 : 포맷에 맞게
*/

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.TimeZone;

public class TimePkgTest {
public static void main(String[] args) {

/* LocalDate : 로컬 날짜 클래스 */
System.out.println(LocalDate.now().toString());
LocalDate targetDate = LocalDate.of(2017, 1, 1);
System.out.println(targetDate.toString());
LocalDate now = LocalDate.now();
System.out.println(now.getMonth());
System.out.println(now.minusMonths(1).getMonth());

//문자열을 파싱해서 LocalDate형으로 변환 : LocalDate의 메서드를 사용할 수 있음
System.out.println(LocalDate.parse("2017.09.09", DateTimeFormatter.ofPattern("yyyy.MM.dd")).toString());


/* LocalTime : 로컬 시간 클래스 */
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime.toString());
System.out.println(nowTime.withHour(10)); // 특정 시로 변경
//String으로 변경 : 특정 포맷으로 포맷팅해서 변환
System.out.println(nowTime.format(DateTimeFormatter.ofPattern("HH시 mm분")));


/* LocalDateTime : 로컬 날짜 및 시간 관련 클래스 */
System.out.println(LocalDateTime.now().toString());


/* ZonedDateTime : 특정 타임존 날짜 및 시간 클래스, ZoneID로 정보를 얻어오는 클래스와 TimeZone 관련 클래스 함께 사용 */
String[] list = TimeZone.getAvailableIDs();
ZonedDateTime zdt = ZonedDateTime.now();
System.out.println("Zone ID : " + zdt.getZone());
System.out.println(ZonedDateTime.now(ZoneId.of(list[0])).toString());


/* Instant : 특정 시점의 타임스탬프 클래스, 두 시점 간에 우선순위를 따질 때 사용 */
Instant ts1 = Instant.now();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

Instant ts2 = Instant.now(); //Instant형 인스턴스

if(ts1.isBefore(ts2)){
/* 앞일 떄 */
} else if(ts1.isAfter(ts2)){
/* 뒤일 때 */
} else {
/* 같을 떄 */
}

System.out.println(ts1.until(ts2, ChronoUnit.NANOS));

}
}