ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바의 정석] 날짜와 시간, 형식화 정리
    JAVA 2022. 10. 25. 01:01
    728x90
    반응형

    Calendar

    Calendar는 java.util.Calendar로 import 할 수 있으며 추상클래스이다.

    • getInstance()를 통해 구현된 객체를 얻을 수 있습니다.
    import java.util.Calendar
    
    Calendar cal1 = new Calendar(); // Error! 추상클래스는 인스턴스를 생성할 수 없다.
    
    Calendar cal2 = Calendar.getInstance(); // OK!

    Date와 Calendar간의 변환

    // 1. Calendar를 Date로 변환
    Calendar cal1 = Calendar.getInstance();
    Date d1 = new Date(cal1.getTimeInMillis()); // Date(long date) 생성자 사용
    
    // 2. Date를 Calendar로 변환
    Date d2 = new Date();
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(d2);

    Calendar의 주요 메서드 - get()

    Calendar에서는 get()을 통해 날짜와 시간 필드를 가져올 수 있다.

    • int get(int field)
    Calendar cal = Calendar.getInstance(); // 지금 날짜와 시간을 가진 인스턴스 생성
    int thisYear = cal.get(Calendar.YEAR); // 올해가 몇년도인지 확인
    int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막 날은 몇일인지 확인

    Calendar에 정의된 필드

    Field Name Description
    YEAR
    MONTH 월 (0 부터 시작한다.)
    예를 들어 1이면 2월이다.
    WEEK_OF_YEAR 그 해의 몇번째 주
    (1월 1일부터 시작)
    WEEK_OF_MONTH 그 달의 몇번째 주
    DATE
    DAY_OF_MONTH 그 달의 몇번째 일
    (DATE랑 같다.)
    DAY_OF_YEAR 그 해의 몇번째 일
    DAY_OF_WEEK 요일 (1~7)
    (1은 일요일을 의미한다.)
    DAY_OF_WEEK_IN_MONTH 그 달의 몇번째 요일
    HOUR 시간 ( 0 ~ 11 )
    HOUR_OF_DAY 시간 ( 0 ~ 23 )
    MINUTE
    SECOND
    MILLISECOND 1 / 1000 초
    ZONE_OFFSET GMT 기준 시차
    ※ 한국은 +9
    AM_PM 0은 오전, 1은 오후
    Calendar today = Calendar.getInstance();
    
    System.out.println("올해 년도 " + today.get(Calendar.YEAR)); // 2022
    System.out.println("월(0~11, 0은 1월) " + today.get(Calendar.MONTH)); // 9
    System.out.println("올 해의 몇번째 주 " + today.get(Calendar.WEEK_OF_YEAR)); // 44
    System.out.println("이 달의 몇번째 주 " + today.get(Calendar.WEEK_OF_MONTH)); // 5
    System.out.println("이 달의 몇 일 " + today.get(Calendar.DATE)); // 24
    System.out.println("이 달의 몇 일 " + today.get(Calendar.DAY_OF_MONTH)); // 24
    System.out.println("이 해의 몇 일 " + today.get(Calendar.DAY_OF_YEAR)); // 297
    System.out.println("요일 (1~7, 1은 일요일) " + today.get(Calendar.DAY_OF_WEEK)); // 2
    System.out.println("이 달의 몇번째 요일 " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 4
    System.out.println("오전 _ 오후 " + today.get(Calendar.AM_PM)); // 0
    System.out.println("시간 (0~11) " + today.get(Calendar.HOUR)); // 3
    System.out.println("시간 (0~23) " + today.get(Calendar.HOUR_OF_DAY)); // 3
    System.out.println("분 (0~59) " + today.get(Calendar.MINUTE)); // 30
    System.out.println("초 (0~59) " + today.get(Calendar.SECOND)); // 56
    System.out.println("1/1000 초 (0~999) " + today.get(Calendar.MILLISECOND)); // 816
    System.out.println("TimeZone(-12 ~ +12) " + today.get(Calendar.ZONE_OF_SET)/(60*60*1000));
    // ZONE_OF_SET은 천분의 1초단위로 나오기 때문에 3,600,000으로 나눠서 표시해 주었다.
    SYstem.out.println("이 달의 마지막 날 " + today.getActualMaximum(Calendar.DATE); // 31

    Calendar의 주요 메서드 - set()

    Calendar에서 set()을 통해 날짜와 시간을 지정하는게 가능하다.

    void set(int field, int value);
    void set(int year, int month, int date);
    void set(int year, int month, int date, int hourOfDay, int minute);
    void set(int year, int month, int date, int hourOfDay, int minute, int second);

    날짜를 지정하는 방법을 알아보자

    • MONTH(월)은 0부터 시작하는 점을 유의해야한다.
    Calendar cal = Calendar.getInstance();
    cal.set(2017,7,15); // 2017년 8월 15일
    // 하나하나 지정하고 싶다면?
    cal.set(Calendar.YEAR, 2017);
    cal.set(Calendar.MONTH, 7);
    cal.set(Calendar.DATE, 15);

    날짜를 지정하는 방법 - 예제

    class CalendarTest{
        final String[] DAY_OF_WEEK = {"","일","월","화","수","목","금","토"};
        Calendar date1 = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();
        
        void dateSet(){
            date1.set(2022,10,23);
            System.out.println("date1 은 " + toString(date1) + DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)] + "요일이고");
            System.out.println("오늘(date2)은 " + toString(date2) + DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)] + "요일 입니다.");
            
            long diff = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;
            System.out.println("date1부터 지금(date2) 까지 " + diff + "초 지났습니다.");
            System.out.println("일(day)로 계산하면 " + diff/(24*60*60) + "일 입니다.");
        }
        
        public String toString(Calendar date){
            return date.get(Calendar.YEAR)+"년"+date.get(Calendar.MONTH)+"월"+date.get(Calendar.DATE)+"일";
        }
    }

    시간을 지정하는 방법을 알아보자

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 22);
    cal.set(Calendar.MINUTE, 20);
    cal.set(Calendar.SECOND, 30);
    // cal의 시간은 지금 22시 20분 30초로 설정되어 있다.

    시간을 지정하는 방법 - 예제

    class CalendarTest{
        final int[] TIME_UNIT = {3600,60,1};
        final String[] TIME_UNIT_NAME = {"시간", "분", "초"};
        
        Calendar time1 = Calendar.getInstance();
        Calendar time2 = Calendar.getInstance();
        
        void timeSet(){
            time1.set(Calendar.HOUR_OF_DAY, 10);
            time1.set(Calendar.MINUTE, 20);
            time1.set(Calendar.SECOND, 30);
            // 10시 20분 30초
            time2.set(Calendar.HOUR_OF_DAY, 20);
            time2.set(Calendar.MINUTE, 30);
            tiem2.set(Calendar.SECOND, 10);
            // 20시 30분 10초
            
            System.out.println("time1 : " + time1.get(Calendar.HOUR_OF_DAY) + "시" + time1.get(Calnedar.MINUTE) + "분" + time1.get(Calendar.SECOND) + "초");
            System.out.println("time2 : " + time2.get(Calendar.HOUR_OF_DAY) + "시" + time2.get(Calnedar.MINUTE) + "분" + time2.get(Calendar.SECOND) + "초");
            
            long diff = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
            System.out.println("time1과 time2의 차이는 " + diff + "초 입니다.");
            
            String tmp = "";
            for(int i = 0; i < TIME_UNIT.length; i++){
                tmp = tmp + diff/TIME_UNIT[i] + TIME_UNIT_NAME[i];
                diff = diff % TIME_UNIT[i];
            }
            System.out.println("시분초로 변환하면 " + tmp + "입니다.");
        }
    }

    Calendar의 주요 메서드 - clear()

    Calendar에서 clear(int field)로 Calendar객체를 초기화 할 수 있다.

    • clear()는 Calendar객체의 모든 필드를 초기화 한다.
    Calendar cal = Calendar.getInstance();
    System.out.println(new Date(cal.getTimeInMillis()));
    // Mon Oct 24 03:40:39 GMT 2022
    cal.clear();
    System.out.println(new Date(cal.getTimeInMillis()));
    // Thu Jan 01 00:00:00 GMT 1970

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

    Calendar cal = Calendar.getInstance();
    System.out.println(new Date(cal.getTimeInMillis()));
    // Mon Oct 24 03:41:25 GMT 2022
    
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MINUTE);
    // 밑에 두개를 같이 해줘야 시간이 초기화 된다.
    cal.clear(Calendar.HOUR);
    cal.clear(Calendar.HOUR_OF_DAY);
    
    System.out.println(new Date(cal.getTimeInMillis()));
    // Mon Oct 24 00:00:00 GMT 2022

    Calendar의 주요 메서드 - add()

    Calendar에서 add()는 특정 필드의 값을 증가 또는 감소 시키며 다른 필드에 영향을 미친다.

    Calendar date = Calendar.getInstance();
    date.clear();
    date.set(2022,7,31); // 2022년 8월 31일
    date.add(Calendar.DATE, 1); // 일(day)에 1을 더한다. >> 2022년 9월 1일이된다.
    date.add(Calendar.MONTH, -8); // 월(month)에서 8을 뺀다 >> 2022년 1월 1일 된다.

    Calendar의 주요 메서드 - roll()

    Calendar에서 roll()은 특정 필드의 값을 증가 또는 감소 시키며 다른 필드에 영향을 미치지 않는다.

    Calendar date = Calendar.getInstance();
    date.clear();
    date.set(2020,7,31); 2020년 8월 31일
    date.roll(Calendar.DATE, 1); // 일(day)에 1을 더한다. >> 2020년 8월 1일
    date.roll(Calendar.MONTH, -8); // 월(month)에서 8을 뺀다. >> 2020년 12월 31일

    숫자의 형식화 - DecimalFormat

    숫자를 다양한 형식(패턴)으로 출력할 수 있게 해준다.

    • Integer.parseInt(), Folat.parsefloat()은 콤마(',')가 포함된 문자열을 숫자로 변환하지 못한다.
    double number = 1234567.89;
    DecimalFormat df = new DecimalFormat("#.#E0");
    String result = df.format(number); // "1.2E6"
    1234567.89를 기준으로 한다.
    기호 의미 패턴 결과
    0 10진수
    값이 없을때는 0
    0
    0.0
    0000000000.0000
    1234568 (반올림)
    1234567.9 (첫째 자리 반올림)
    0001234567.8900
    # 10진수 #
    #.#
    ##########.####
    1234568 (반올림)
    1234567.9 (첫째 자리 반올림)
    1234567.89
    . 소수점 #.# 1234567.9 (첫째 자리 반올림)
    - 음수 부호 #.#-
    -#.#
    1234567.9-
    -1234567.9
    , 단위 구분자 #,###,##
    #,####,##
    1,234,567.89
    123,4567.89
    E 지수 기호 #E0
    0E0
    ##E0
    00E0
    ####E0
    0000E0
    #.#E0
    0.0E0
    0.000000000E0
    #.#########E0
    .1E7
    1E6
    1.2E6
    12E5
    123.5E4
    1235E3
    1.2E6
    1.2E6
    1.234567890E6
    1.23456789E6

    날짜의 형식화 - SimpleDateFormat

    날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.

    Date today = new Date();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    String result = df.format(today); // 2022-10-24
    // 오늘 날짜를 yyyy-MM-dd 형태로 변환해서 반환한다.
    
    
    // 특정 형식으로 되어있는 문자열에서 날짜와 시간을 뽑아 낼수 있다.
    DateFormat df2 = new SimpleDateFormat("yyyy년 MM월 dd일");
    DateFormat df3 = new SimpleDateFormat("yyyy/MM/dd");
    
    Date d = df2.parse("2015년 11월 23일"); // 문자열을 Date로 변환
    String result = df3.format(d); // 2015/11/23
    기호 의미 보기 (예시)
    G 연대 (BC, AD) AD
    y 년도 2022
    M 월 (1~12 또는 1월~12월) 10 또는 10월 또는 OCT
    w 년의 몇번째 주 (1~53) 50
    W 월의 몇번째 주 (1~5) 4
    D 년의 몇번째 일 (1~365) 120
    d 월의 몇번째 일 (1~31) 15
    F 월의 몇번째 요일 (1~5) 4
    E 요일
    a 오전 / 오후 (AM, PM) PM
    H 시간 (0~23) 20
    k 시간 (1~24) 13
    K 시간 (0~11) 10
    h 시간 (1~12) 11
    m 분 (0~59) 35
    s 초 (0~59) 55
    S 천분의 일초 (0~999) 253
    z TimeZone(General time zone) GMT + 9:00
    Z TimeZone(RFC 822 time zone) +0900
    ` escape 문자
    (특수문자를표현하는데 사용)
    없음
    Date today = new Date(); // 현재 시간과 날짜를 today에 저장
    SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
    SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;
    
    sdf1 = new SimpleDateFormat("yyyy-MM-dd");               // 2022-10-24
    sdf2 = new SimpleDateFormat("``yy년 MMM dd일 E요일");    // ``22년 OCT 24일 Mon요일
    sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");  // 2022-10-24 08:43:22.837
    sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");    // 2022-10-24 08:43:22 AM
    
    sdf5 = new SimpleDateFormat("오늘은 올해의 D번째 날입니다.");    // 297 번째 날
    sdf6 = new SimpleDateFormat("오늘은 이달의 d번째 날입니다.");    // 24 번째 날
    sdf7 = new SimpleDateFormat("오늘은 올해의 w번째 주입니다.");    // 44 번째 주
    sdf8 = new SimpleDateFormat("오늘은 이달의 W번째 주입니다.");    // 5 번째 주
    sdf9 = new SimpleDateFormat("오늘은 이달의 F번째 E요일입니다."); // 4 번째 Mon 요일

    java.time 패키지

    Date와 Calendar의 단점을 보완하기 위해 추가된 패키지 (JDK 1.8 부터) 이다.

    • 이 패키지에 속한 클래스들은 모두 불변이다.

    java.time 패키지의 핵심 클래스

    날짜를 표현할 때는 LocalDate, 시간을 표현할 때는 LocalTime을 사용한다.

    • 날짜와 시간을 같이 표현하고 싶다면 LocalDateTime을 사용하면 된다.
    • 만약 시간대(time-zone)까지 다뤄야 한다면 ZoneDateTime을 사용하면 된다.
    • 날짜간의 차이는 Period, 시간의 차이는 Duration을 사용하면 된다.
    • now()는 현재 날짜 시간을, of()는 특정 날짜 시간을 지정하는데 사용된다.
    LocalDate today = LocalDate.now(); // 오늘의 날짜 (2022-10-24)
    LocalTime now = LocalTime.now(); // 현재 시간
    
    LocalDate birthDate = LocalDate.of(1993,3,1); // 1993년3월 1일
    LocalTime birthTime = LocalTime.of(23,59,59); // 23시 59분 59초
    
    // 일 단위나 초단위로 지정가능 (1일은 24*60*60)
    LocalDate birthDate2 = LocalDate.ofYearDay(1993,365); // 1993년 12월 31일
    LocalTime birthTime2 = LocalTime.ofSecondDay(86399); // 23시 59분 59초
    
    // parse()로 문자열을 LocalDate나 LocalTime으로 변환할 수 있다.
    LocalDate birthDate3 = LocalDate.parse("1999-12-31"); // 1999년 12월 31일
    LocalTime birthTime3 = LocalTime.parse("23:59:59"); // 23시 59분 59초

     

     

    728x90
    반응형
Designed by Tistory.