Calendar cal = new Calendat(); // ERROR!
추상클래스는 인스턴스를 생성할 수 없다
따라서, 아래와 같이 해줘야한다.
Calendar cal = Calendar.getInstance(); //OK
getInstance()메서드를 사용해 Calendar 클래스를 구현한 클래스의 인스턴스를 반환해줘야한다.
getInstance()사용시 사용한 시스템 정보를 읽어와서 어떤 캘린더를 사용하는지 판단해서 아래 세가지 중 한가지를 반환해준다.
Calendar 클래스에는
- 서양력
- 불교력
- 일본력
이 있다. 우리나라는 서양력(Gregorian)을 쓴다.
따라서Calendar cal = new GregorianCalendar(); 라고 보면 된다. 이렇게 그레고리언으로 특정 짓지 않는 이유는 만약 력이 바뀔 때마다 바꿔줘야 하니
아예 Calendar cal = Calendar.getInstance();으로 메서드를 통해 시스템에 맞게 바꿔서 반환되게끔 만들어 준 것이다.(=추상화)
Calendar cal = Calendar.getInstance(); //현재 날짜와 시간으로 셋팅된 Calendar 객체 생성
int thisYear = cal.get(Calendar.YEAR); //올해가 몇년인지 알아내고
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); //이 달의 마지막 날
↳ 맨위는 특정 필드 값 지정
예제1) 날짜계산
- 두 날짜간의 차이를 얻기 위해 날짜1, 날짜2를 각각 초단위로 변환한다.
그래서 나온 날짜1-날짜2 의 결과 값을 시분초로 바꾸거나...등등 해서 만든다.
- 날짜시간을 초단위로 바꾸기 위해서는 1000으로 나눈다.(1000=1초)
- 24시간60분60초
예제2) 시간계산
- 초단위로 바꿔서 계산 → 시분초를 ms로 변환한다.
- 절대값으로 구하기 위해 Math.abs() 사용한다.
- getTimeMillis() 메서드 사용
↳ 큰단위부터 작은단위 순으로 나눈다. 나머지를 가지고 반복문을 돌려서 계속 나누기 반복
예제1)
예제2)
(하위 호환성을 신경쓰며 개선되었기 때문에!)
double number = 1234567.89; // ← 10진수
DecimalFormat df = new DecimalFormat("#.#E0); //지수 형식 표현
String result = df.format(number); // result = "1.2E6" (1.2x10⁶)
//지수 표현으로 출력 가능
DecimalFormat df = new DecimalFormat("#,###.##"); // #,###.##이라고 형식을 알려주면
Number num = df.parse("1,234,567.89"); // 문자 "1,234,567.89"를
double d = num.doubleValue(); //1234567.89 ← 숫자로 바꿔준다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// 오늘 날짜를 yyyy-MM-dd 형태로 변환하여 반환한다.
String result = df.format(today);
↳ 대문자 D는 1월 1일부터 시작해서 몇 번째 일인지. 소문자 d는 그 월의 몇번째 일인지
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
Date d = df.parse("2022년 12월 25일"); //문자열을 Date로 변환
String result = df2.format(d));
↳ 대문자 H는 24시간 기준, 소문자 h는 12시간 기준이다.