| 날짜, 시간 관련 클래스
1. 날짜 데이터는 언제 쓸까?
- 날짜 및 시간에 관한 데이터는 아래의 예시와 같이 다양한 웹 or 앱 서비스에서 사용하고 있다.
- 일반적인 회원가입일자 - 쇼핑몰의 주문일자 - 그룹웨어 회의일자 및 시간/장소대여일자 - 모바일앱 특정시간에 알람 - 등등 |
2. Java의 날짜 및 시간 관련 클래스
- 날짜 객체는 JDK업데이트 과정에서 Data -> Calender -> LocalDate로 발전하였다.
(1) Date today = new Date(); 와 같이 Date 객체만을 사용해서 날짜를 표현
(2) Date today = Calendar.getInstance().getTime(); - Calendar를 통해 싱글톤 방식으로 인스턴스 생성하여 사용
(3) LocalDate today = LocalDate.now(); - Calendar를 보완한 LocalDate를 사용
- JDK8 이후부터는 공식적으로 Calendar는 deprecated(더 이상 사용하지 않는) 객체로 지정되었지만
국내의 현실 개발 환경에서는 아직까지 Calendar를 사용하는 경우도 많으며, Date객체만 사용하는 경우도 더러 있다고 한다.
JAVA 8 이전 (deprecated) | JAVA 8 이후 | |
날짜 클래스 | java.util의 Data와 Calendar | java.time의 LocalDate/ LocalTime/ LocalDateTime |
포맷 클래스 | SimpleDataFormat | DateTimeFormatter *TimeStamp.of()를 쓰기도 한다. |
문제점/보완 | Thread-safe X 0부터 시작하는 월 지정 인덱스 Data, Calendar 클래스 사용의 혼란 |
Thread-safe O 월이 1, 2, 3...으로 시작한다 isBefore(), isAfter()와 같은 메소드 추가 |
| Date와 Calendar 사용
- Calendar의 단점 중에 하나가 월을 0부터 표현한다는 것이었다.
- 아래 코드를 보면 알 수 있겠지만, 연도나 일은 그럼에도 1부터 시작하는 걸 볼 수 있다.
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd E요일 HH:mm:ss:SSS");
Date today = Calendar.getInstance().getTime();
System.out.println(simpleDateFormat.format(today));
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE);
System.out.printf("%d년 %d월 %d일\n", year, month, day); // 월이 0부터 시작
month += 1;
System.out.printf("%d년 %d월 %d일\n", year, month, day); // 1을 더해주어야 한다.
}
}
>> 결과
2022-08-10 수요일 00:10:32:924
2022년 7월 10일
2022년 8월 10일
| LocalDate / LocalTime / LocalDateTime 사용
- 간단하게 생성하는 법, 연/월/일을 얻는 법을 작성해보았다.
| LocalDate를 활용해 달력 출력하기
- 먼저 구하려는 날짜의 LocalDate를 생성하고, lenthOfMonth()로 그 달의 일수를 구한다.
// 해당 달의 일수 구하기 : lengthOfMonth()
LocalDate date = LocalDate.of(2012,12,1);
int lengthOfMonth = date.lengthOfMonth();
- 해당 월의 1일자가 몇 요일인지, getDayOfWeek().getValue()로 구한다.
int dayOfWeek = date.getDayOfWeek().getValue(); //월화수목.. = 1234..
- 주차를 구하는 방법은 임의로 만들었는데, (전체월 일수 + (7 - 1일자 요일번호))를 7로 나누어 반올림하였다.
int weeksOfMonth = Math.round((lengthOfMonth + (7 - dayOfWeek))/7f);
- 이 세가지를 구한 후, 2차원 배열을 만들고, 1일자의 시작 요일에 맞춰 입력 후, 출력은 이중 for문으로 했다.
- 전체 코드
- 출력 결과 *한글와 숫자깨짐은 무시한 결과다.
[달력 출력 프로그램]
달력의 년도를 입력해 주세요.(yyyy):2022
달력의 월을 입력해 주세요.(mm):7
[2022년 07월]
일 월 화 수 목 금 토
01 02
03 04 05 06 07 08 09
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
| Date -> LocalDateTime 또는 LoalDateTime -> Date로 변환
- JDK8부터 Date객체에 from() 메소드가 추가되어 LocalDateTime -> Date로 변환이 가능해졌다.
- Date -> LocalDateTime
LocalDateTime.ofInstant(date.toInstant(), /* ZoneId */);
- LocalDateTime -> Date
Date.from(local.atZone(/*ZoneId*/).toInstant())
- atZone()을 넣는 것은 시간대를 구분하기 위해서 넣는 것이다. (아래는 컴퓨터의 시간대 적용)
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
public class LocalDateTest {
public static void main(String[] args) {
// A. Date와 LocalDateTime으로 현재시각 구하기
// (1) Date 타입의 날짜
Date date = Calendar.getInstance().getTime();
// (2) LocalDateTime 타입의 날짜
LocalDateTime localDateTime = LocalDateTime.now();
// B. LocalDateTime -> Date
Date localToDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
// C. Date -> LocalDateTime
LocalDateTime dateToLocal = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}
}
[ 참고 및 출처 ]
- 부트 캠프 강의를 듣고 정리한 내용입니다.
- 날짜 타입 변환 관련 : https://recordsoflife.tistory.com/336
- [기본기를 쌓는 정아마추어 코딩블로그:티스토리], https://jeong-pro.tistory.com/163
- [슬기로운 개발생활:티스토리] https://dev-coco.tistory.com/31
- [삼바:티스토리], https://samba-java.tistory.com/18
'Language > Java' 카테고리의 다른 글
JAVA 라이브러리 - 컬렉션 (0) | 2022.08.11 |
---|---|
JAVA 라이브러리 - 제네릭 클래스 (0) | 2022.08.10 |
JAVA 라이브러리 - Java.lang 패키지 (0) | 2022.08.08 |
객체지향 언어의 특징 4_캡슐화 (정보 은닉) (0) | 2022.07.22 |
객체지향 언어의 특징 3_다형성 (사용 편의성) (0) | 2022.07.22 |