럿고의 개발 노트

[프로그래머스] 자바 중급 > Part4. 날짜와 시간 본문

Java Note/[프로그래머스] 자바 중급(동영상 강의)

[프로그래머스] 자바 중급 > Part4. 날짜와 시간

KimSeYun 2020. 2. 4. 10:22

[프로그래머스] 자바 중급

Part4. 날짜와 시간

1. Date

  • 날짜와 시간을 구하기 위한 클래스로 Date 클래스는 JDK 1.0때 만들어 졌으며 Calendar클래스는 JDK 1.1때 만들어 짐.
  • Date는 지역화 대한 부분이 고려되지 않아 Calendar 클래스가 만들어졌다.
    • 지역화란, 지역에 따라서 시간, 통화, 언어등에 대해 고려하는 프로그래밍을 지역화에 맞춘 프로그래밍이라고 함.
  • Date클래스를 보면 대부분의 생성자와 메소드가 Deprecated(사용중지권고)가 되어 있다.
  • 기본 생성자를 이용한 Date클래스 생성
    • 기본 생성자로 Date인스턴스를 만들게 되면 현재 시간과 날짜 정보를 Date인스턴스가 가지게 됨.
  • toString() 메소드를 이용하여 현재 시간을 문자열로 구할 수 있음
  • java.util.SimpleDateFormat 클래스를 이용하여 원하는 형태로 출력 가능
    • yyyy : 년도
    • MM : 월(대문자로 써야함!)
    • dd : 일
    • hh : 시간
    • mm : 분(소문자로 써야함!)
    • ss : 초
    • a : 오전 / 오후
    • zzz : TimeZone
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExam {
    public static void main(String[] args) {
        // java.util.Date
        // 지역화에 대한 고려가 되어있지 않음
        // Date클래스는 대부분의 생성자와 메소드가 Deprecated가 되어 있음
        // 즉, 지원을 하지 않고 문제가 될수 있기 때문에 사용하지 말라는 것

        Date date = new Date();
        System.out.println(date.toString());

        SimpleDateFormat ft = new SimpleDateFormat("yyyy.MM.dd 'at' hh:mm:ss zzz"); // 내가 원하는 방식으로 날짜와 시간을 출력해주는 것
        System.out.println(ft.format(date));

        long today = System.currentTimeMillis(); // 현재 시간을 Loong값으로 구하기

        System.out.println(today);

        System.out.println(today - date.getTime()); // 시간 연산
    }
}

2. Calendar

  • Date의 단점을 해결하고 등장한 것이 Calendar 클래스
  • 생성 방법
    • Calendar Class는 추상클래스임.
    • Calendar가 가지고 있는 클래스 메소드 getInstance()를 사용하여 인스턴스를 생성해야 한다.
    • getInstance()메소드를 호출하면 내부적으로 java.util.GregorianCalendar 인스턴스를 만들어서 리턴한다.
    • GregorianCalendar는 Calendar의 자식 클래스이다.
  • Calendar 클래스를 이용해서 현재 날짜, 시간에 대한 정보를 알아내는 방법
    • Calendar는 현재 날짜, 시간 정보를 가지고 있음
    • get메소드에 Calendar의 상수를 어떤 것을 넣어주느냐에 따라서 다른 값이 나오게 됨.
    • Calendar.YEAR : 년도
    • Calendar.MONTH : 월(0(1월) ~ 11(12월))
    • Calendar.DATE : 일
    • Calendar.HOUR_OF_DAY : 시
    • Calendar.MINUTE : 분
  • 원하는 날짜, 시간에 대한 정보를 얻어오는 방법
    • add메소드를 이용
    • 상수와 정수를 사용하여 +,- 연산 가능
import java.util.Calendar;

public class CalendarExam {
    /* java.util.Calendar
     * java1.1에 추가, date클래스가 지역화를 고려하지 않기 때문에, 지역화 고려를 위해 추가  
     * 상수가 많이 존재
     * 추상클래스이기 때문에 new연산자를 이용해서 생성자를 만들수 없음
     * Gregorian Calendar를 받아서 getInstance();로 불러옴
     * 미래에 새로운 형식의 표준 달력이 만들게 되면 업그레이드한 다른 달력 클래스가 쉽게 리턴할수 있도록 하기 때문
     */
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        System.out.println(cal.get(Calendar.YEAR)); // 년도
        System.out.println(cal.get(Calendar.MONTH) + 1); // 달 * 월은 0부터 인식하기때문에 제대로된 달은 +1를 해줘야 함
        System.out.println(cal.get(Calendar.DATE)); // 일

        System.out.println(cal.get(Calendar.HOUR)); // 12시간 기준
        System.out.println(cal.get(Calendar.HOUR_OF_DAY)); // 24시간 기준

        System.out.println(cal.get(Calendar.MINUTE)); // 분

        System.out.println("=========================================");
        cal.add(Calendar.HOUR, 5); // 전후 시간을 구할수 있는 법

        System.out.println(cal.get(Calendar.YEAR)); // 년도
        System.out.println(cal.get(Calendar.MONTH) + 1); // 달 * 월은 0부터 인식하기때문에 제대로된 달은 +1를 해줘야 함
        System.out.println(cal.get(Calendar.DATE)); // 일

        System.out.println(cal.get(Calendar.HOUR)); // 12시간 기준
        System.out.println(cal.get(Calendar.HOUR_OF_DAY)); // 24시간 기준

        System.out.println(cal.get(Calendar.MINUTE)); // 분

        Calendar cal2 = Calendar.getInstance();

        cal2.add(Calendar.DATE, 100);
        StringBuffer sb = new StringBuffer();
        sb.append(cal2.get(Calendar.YEAR) + "년");
        sb.append(cal2.get(Calendar.MONTH) + "월");
        sb.append(cal2.get(Calendar.DATE) + "일");

        System.out.println(sb);        
    }
}

3. java.time 패키지

  • Java에서 제공하는 Date, Time API는 부족한 기능 지원을 포함한 여러가지 문제점을 가지고 있었다.
  • JDK 코어에서 이런 문제점들을 해결하고 더 좋은 직관적인 API들을 제공하기 위해 새롭게 재 디자인한 Date, Time API를 Java SE8부터 제공
  • 핵심 클래스는 오브젝트를 생성하기 위해 다양한 factory 메서드를 사용
  • 오브젝트 자기 자신의 특정 요소를 가지고 오브젝트를 생성할 경우 of 메서드를 호출하면 되고, 다른 타입으로 변경할 경우에는 from 메서드를 호출하면 됨.
  • LocalDateTime 클래스를 이용해서 현재 시간 time 객체 생성 가능
    • new() 메서드는 현재 시간을 구함.
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;

public class TimeExam {
    public static void main(String[] args) {
        /* java.time 패키지
         * java.util.Date는 직관적이지 못했음(달을 구할때 +1를 해줘야 하는 것 등)
         * Joda-Time : 자바 Date와 Time을 대신 할 수 있는 클래스를 제공하는 라이브러리
         * java SE8부터 새롭게 디자인한 Date, Time Api 제공
         * 핵심 클래스는 오브젝트를 생성하기 위해 다양한 factory 메소드를 사용
         */

        LocalDateTime timePoint = LocalDateTime.now(); // 현재의 날짜와 시간을 구함
        System.out.println(timePoint);

        LocalDate ld = LocalDate.of(2012, Month.DECEMBER, 12); // 내가 원하는 날짜를 지정할수 있는 법
        System.out.println(ld);

        LocalTime lt = LocalTime.of(17, 18); // 내가 원하는 시간을 반환
        System.out.println(lt);
        LocalTime lt2 = LocalTime.parse("10:15:30"); // 해당 타입에 대한 객체가 생성
        System.out.println(lt2);

        LocalDate theDate = timePoint.toLocalDate();

        System.out.println(theDate);
        System.out.println(timePoint.getMonthValue()); // 월(이것의 장점은 + 1을 하지 않아도 실제 달이 나옴)
        Month month = timePoint.getMonth();
        System.out.println(month.getValue());
        System.out.println(timePoint.getHour());        
    }
}

출처

[프로그래머스] 자바 중급

Comments