[개인공부] 날짜와 시간

Walter Mitty·2022년 12월 25일
0

개인공부

목록 보기
30/40
post-thumbnail

java.

java.util.Date

  • 날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK 1.0이상)
  • Date 의 메서드는 거의 deprecated(앞으로 사용하지마..) 되었지만, 여전히 쓰이고 있다.

java.util.Calendar

  • Date 클래스를 개선한 새로운 클래스(JDK1.1이상)
    • 그러나 여전히 단점히 존재한다

java.time 패키지

  • Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공(JDK 1.8=Java8 이상)
  • 여기서 말하는 Date와 Calendar의 단점은 '날짜와 시간'을 함께 다룬다는 것이다.
  • time 패키지에서는
    • 날짜: LocalDate
    • 시간: LocalTime
    • 날짜+시간: LocalDateTime
      으로 세분화 되어있다.

Calendar 클래스

  • 추상 클래스이므로 getInstance() 를 통해 구현된 객체를 얻어야 한다.
Calendar cal = new Calendat(); // ERROR! 

추상클래스는 인스턴스를 생성할 수 없다
따라서, 아래와 같이 해줘야한다.

Calendar cal = Calendar.getInstance(); //OK

getInstance()메서드를 사용해 Calendar 클래스를 구현한 클래스의 인스턴스를 반환해줘야한다.
getInstance()사용시 사용한 시스템 정보를 읽어와서 어떤 캘린더를 사용하는지 판단해서 아래 세가지 중 한가지를 반환해준다.

Calendar 클래스에는

  • 서양력
  • 불교력
  • 일본력
    이 있다. 우리나라는 서양력(Gregorian)을 쓴다.
    따라서

    Calendar cal = new GregorianCalendar(); 라고 보면 된다. 이렇게 그레고리언으로 특정 짓지 않는 이유는 만약 력이 바뀔 때마다 바꿔줘야 하니
    아예 Calendar cal = Calendar.getInstance();으로 메서드를 통해 시스템에 맞게 바꿔서 반환되게끔 만들어 준 것이다.(=추상화)



Calendar 클래스 예제1

get()으로 날짜와 시간 필드 가져오기

  • int get(int field) ← int field 자리에 Calendar.YEAR 나 Calendar.DATE가 들어간다.
  Calendar cal = Calendar.getInstance(); //현재 날짜와 시간으로 셋팅된 Calendar 객체 생성
  int thisYear = cal.get(Calendar.YEAR); //올해가 몇년인지 알아내고
  int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); //이 달의 마지막 날 
  • Calendar에 정의된 필드
    • 참고로 MONTH는 0부터 시작한다는 걸 주의하자.
      7이면 8월을 뜻하고, 0이면 1월을 뜻한다.
    • WEEK_OF_YEAR: 그 해 1월 1일 부터 시작해서 지금이 몇번째 주인지 계산
  • 시간관련 필드

    예제)


Calendar 클래스 예제2

set()으로 날짜와 시간 지정하기

↳ 맨위는 특정 필드 값 지정

  • 날짜 지정하는 방법
    • 월(MONTH)이 0부터 시작한다는 점에 주의
      • MONTH가 {"JAN","FEB" ... } 이런식으로 되어있어서 idx 0번째가 1월.

  • 시간 지정하는 방법/

예제1) 날짜계산

  • 두 날짜간의 차이를 얻기 위해 날짜1, 날짜2를 각각 초단위로 변환한다.
    그래서 나온 날짜1-날짜2 의 결과 값을 시분초로 바꾸거나...등등 해서 만든다.
    • 날짜시간을 초단위로 바꾸기 위해서는 1000으로 나눈다.(1000=1초)
    • 24시간60분60초

예제2) 시간계산

  • 초단위로 바꿔서 계산 → 시분초를 ms로 변환한다.
    • 절대값으로 구하기 위해 Math.abs() 사용한다.
    • getTimeMillis() 메서드 사용

      ↳ 큰단위부터 작은단위 순으로 나눈다. 나머지를 가지고 반복문을 돌려서 계속 나누기 반복

Calendar 클래스 예제 2, 3

clear()는 Calendar 객체의 모든 필드를 초기화 한다.

clear(int field)는 Calendar 객체의 특정 필드를 초기화 한다.



Calendar 클래스 예제 4, 5

add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향을 준다)

  • 특정 날짜로부터 일주일 뒤, 일주일 전 이런식으로 구할 때 사용
  • 만약 add()로 1을 더해주면 8월 31일 은 9월 1일이 된다.(일 필드의 변화가 월 필드에 영향을 준다!)

roll()은 특정 필드의 값을 증가 또는 감소(다른 필드에 영향을 주지 않는다)

  • roll()로 일 1을 날짜에 더해도 9월 1일이 아니라 그대로 8월이고
  • roll()로 월 8을 월에서 빼도 2019년 12월 31일이 아니라 그대로 2020년이다.

예제1)

예제2)



Date와 Calendar간의 변화

Date 의 메서드는 대부분 deprecated 되었지만 여전히 사용되는 것이 있음

(하위 호환성을 신경쓰며 개선되었기 때문에!)


형식화 클래스(java.text 패키지)

DecimalFormat(10진수 숫자)

  • 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능하다.(숫자,날짜 → 형식 문자열)
    • 10진수 숫자를 형식화 할 때 사용(숫자를 형식 문자열로)
double number = 1234567.89; // ← 10진수
DecimalFormat df = new DecimalFormat("#.#E0); //지수 형식 표현
String result = df.format(number); // result = "1.2E6" (1.2x10⁶)
//지수 표현으로 출력 가능
  • 형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 → 숫자, 날짜)
    • 참고: Integer.parseInt()는 콤마(,)가 포함된 문자열을 숫자로 변환 못함
DecimalFormat df = new DecimalFormat("#,###.##"); // #,###.##이라고 형식을 알려주면 
Number num = df.parse("1,234,567.89"); // 문자 "1,234,567.89"를
double d = num.doubleValue(); //1234567.89 ← 숫자로 바꿔준다.


SimpleDateFormat

  • 날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.
    • 데시몰이 숫자를 문자열로, 문자열을 숫자로 할 땐 parse()였다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

// 오늘 날짜를 yyyy-MM-dd 형태로 변환하여 반환한다.
String result = df.format(today);

↳ 대문자 D는 1월 1일부터 시작해서 몇 번째 일인지. 소문자 d는 그 월의 몇번째 일인지

  • 특정 형식으로 되어있는 문자열에서 날짜와 시간을 뽑아 낼 수도 있다.
    • 문자열에서 날짜와 시간은 parse(), 날짜와 시간에서 문자열은 format()
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시간 기준이다.

0개의 댓글