* time 패키지(2014년)
- 날짜와 시간을 다룰 목적으로 만들어진 클래스. Date 클래스(1995년), Calender클래스(1997년)를 개선한 새로운 클래스
LocalDate, LocalTime 날짜, 시간을 따로 다룰 수 있어짐 (Date, Calender는 동시에만 가능)
날짜와 시간을 다루는 방법을 공부!
* Calendar 클래스
- 추상 클래스이므로 getInstance() 를 통해 구현된 객체를 얻어야 함.
추상클래스는 일반적으로 객체 생성 불가.
그래서Calendar 클래스는 getInstance() 를 오버라이딩 해 사용자의 시간대와 맞는 캘린더를 불러와준다!
Calendat cal = new Calendar(); // 에러! 추상클래스는 인스턴스 생성 불가.
Calendar cal = Calendar.getInstance();
- get() : 날짜와 시간 필드 가져오기. 현재의 시간 정보 가져옴.
Calendar cal = Calendar.getInstance();
int thisYear = cal.get(Calendar.YEAR);
Calendar에 정의된 필드
| YEAR | 년 | HOUR | 시간(0~11) |
| MONTH | 월(0부터 시작) | HOUR_OF_DAY | 시간(0~23) |
| DATE | 일 | MINUTE | 분 |
| WEEK_OF_YEAR | 그 해의 몇 번째 주 | SECOND | 초 |
| WEEK_OF_MONTH | 그 달의 몇 번째 주 | MILLISECOND | 천분의 일초 |
| DAY_OF_MONTH | 그 달의 몇번째 일 | ZONE_OFFSET | GMT기준 시차(천분의 일초 단위) |
| DAY_OF_YEAR | 그 해의 몇 번째 일 | AM_PM | 오전/오후 |
| DAY_OF_WEEK | 요일 (1~7) | ||
| DAY_OF_WEEK_IN_MONTH | 그 달의 몇 번째 요일 |
- set() : 날짜 시간 지정하기.
Calendar date1 = Calendar.getInstance();
date1.set(2017,7,15); // 2017년 8월 15일 (7월 아님!)
//시간 지정하는 방법, 따로 오버로딩 되있지 않아 따로 지정해줘야함.
Calendar time1
time1.set(Calendar.HOUR_OF_DAY,10);
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
- getTimeInMillis() : 날짜, 시간을 1/1000 초 로 나타냄.
날짜 간 차이를 계산할 때 초단위로 바꿔 그 차이를 계산.
이후 이 초를 시간. 날짜 단위로 바꿔서 사용.
long difference = date2.getTimeInMillis() - date1.getTimeInMillis()
// 초 --> 시간으로 바꾸기
final int[] TIME_UNIT = {3600, 60, 1};;
final String[] TIME_UNIT_NAME ] {"시간", "분", "초"};
String tmp = "";
for(int i = 0; i < TIME_NUIT.length;i++){
tmp += difference/TIME_NUIT[i] + TIME_UNIT_NAME[i];
difference %= TIME_UNIT[i];
}
- clear() : Calendar 객체의 모든 필드를 초기화.
객체 생성하고 초기화를 안 해주면 문제가 생길 수 있음!
두 날짜 차이를 계산하는 메서드를 만들 때, 객체가 생기는데 ms에서 아주 약간의 차이가 발생할 수 있음.
따라서 차이를 int형으로 바꾸면서 약간의 차이가 큰 차이를 만듦.
현재 시간 사용하는게 아니라면 객체 생성 후 꼭 초기화!
- add() : 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 O)
Calendar date = Calendar.getInstance();
date.clear(); // 모든 필드 초기화
date.set(2020, 7, 31); // 2020년 8월 31일
date.add(Calendar.DATE, 1); // 날짜 에 1 더하기 --> 9월 1일
date.add(Calendar.MONTH, -8); // 월에 8 빼기 --> 1월 1일
- roll() : 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 X)
Calendar date = Calendar.getInstance();
date.clear(); // 모든 필드 초기화
date.set(2020, 7, 31); // 2020년 8월 31일
date.add(Calendar.DATE, 1); // 날짜 에 1 더하기 --> 2020년 8월 1일 (add면 9월 1일)
date.add(Calendar.MONTH, -8); // 월에 8 빼기 --> 2020년 1월 1일 (add 면 2019년)
* 형식화 클래스
- java.text.패키지의 DecimalFormat, SimpleDateFormat
숫자와 날짜를 원하는 형식으로 쉽게 출력 가능. (숫자, 날짜 --> 형식 문자열)
1. DecimalFormat
- 숫자를 원하는 형식으로 출력하게 해 줌
double number = 123567.89;
DecimalFormat df = new DecimalFOrmat("#.#E0");
String result = df.format(number);
반대로 형식 문자열 --> 숫자, 날짜 도 가능
DecimalFormat df = new DecimalFormat("#,###.##");
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); // 1234567.89
콤마 가 있는 경우 parseDouble 같은 메서드로는 변환 불가,
2. SimpleDateFormat
- 날짜와 시간을 다양한 형식으로 출력하게 해 줌
'코딩 > JAVA 공부' 카테고리의 다른 글
| [JAVA] 자바의 정석 _ Arrays (0) | 2022.10.15 |
|---|---|
| [JAVA] 자바의 정석 _ Collection Framework/ List(ArrayList, LinkedList), Stack, Queue, Iterator (0) | 2022.10.14 |
| [JAVA] 자바의 정석 _ Object, String, StringBuffer, StringBuilder, Math 클래스 / 오토박싱, 언박싱 (0) | 2022.10.12 |
| [JAVA] 자바의 정석 _ 예외 (try-catch 문) (0) | 2022.10.11 |
| [JAVA] 자바의 정석 _ 내부 클래스 (0) | 2022.10.11 |