minghxx.blog
  • 자바의 정석 ch10 날짜와 시간 & 형식화
    2023년 08월 13일 06시 07분 05초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    ch 10-1~3 날짜와 시간 Calendar 클래스

    1. 날짜와 시간

    java.util.Date : 날짜와 시간을 다룰 목적으로 만들어진 클래스

    java.util.Calendar : Date클래스를 개선한 새로운 클래스

    java.time패키지 : JDK1.8 Date와 Calendar의 단점(날짜와 시간을 같이 다룸 등)을 개선한 새로운 클래스 제공

     

    2. Calendar 클래스

    추상 클래스이므로 getInstance()통해 구현된 객체를 얻어야함

    // 에러 추상 클래스는 인스턴스를 생성할 수 없음
    // Calendar cal = new Calendar(); 
    
    // getInstance() 메서드를 이용해 Calendar클래스를 구현한 인스턴스 반환
    Calendar cal = Calendar.getInstance();

    3. get() 메서드

    int get(int field) 필드 이용해 시간과 날짜를 가져올 수 있음

    Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅
    int year = cal.get(Calendar.YEAR); // 올해 년도
    itn lastDayOfMonth = calgetActualMaximum(Calendar.DATE); // 이 달의 마지막 날짜

     

    4. Calendar에 정의된 필드

    필드명 설명
    YEAR
    MONTH 월(0~11)
    WEEK_OF_YEAR
    WEEK_OF_MONTH 그 달의 몇 번째 주
    DATE
    DATE_OF_MONTH 그 달의 몇 번째 일
    DATE_OF_YEAR 그 해의 몇 번째 일
    DATE_OF_WEEK 요일
    DATE_OF_WEEK_IN_MONTH 그 달의 몇 번째 요일
    HOUR 시간(0~11)
    HOUR_OF_DAY 시간(0~23)
    MINUTE
    SECOND
    MILLISECOND 천분의 일초
    ZONE_OFFSET gmt기준 시차
    AM_PM 오전/오후

    ch 10-4~8 Calendar 클래스 예제

    1. set() 메서드 이용 날짜와 시간 지정하기

    Calendar cal = Calendar.getInstance();
    cal.set(2023, 7, 13, 10, 20, 30); // 23년 8월 13일 10시 20분 30초로 설정
    // 하나씩 필드로 설정할 수 있음
    // cal.set(Calendar.YEAR, 2023); 
    // cal.set(Calendar.MONTH, 7);
    // cal.set(Calendar.DATE, 13);
    
    // 시간만 따로 셋팅하는 메서드는 없음 필드 이용해 하나씩 설정해야함
    // 10시 20분 30초로 설정
    cal.set(Calendar.HOUR_OF_DAY, 10);
    cal.set(Calendar.MINUTE, 20);
    cal.set(Calendar.SECOND, 30);

     

    2. 날짜 연산

    초단위로 계산해서 반환

    // 두 날짜간 차이를 얻으려면 천분의 일초 단위로 변환하여 계산
    long difference = (date2.getTimeInMillis() - date1.getTimeInMillis())/1000; // 1000으로 나누면 초단위로 나옴
    int differenceDay = difference/(24*60*60); // 1일 = 24 * 60 * 60

     

    3. clear()

    Calendar 객체의 모든 필드를 초기화 → 1970년 1월 1일 00:00:00

    오차 없애기 위해 사용해주는 것이 좋음

    // 특정 필드만 초기화 가능
    dt.clear(Calendar.SECOND); // 초 0으로 초기화

     

    4. add()

    특정 필드 값을 증가 또는 감소, 다른 필드에 영향있음

    date.set(2023, 8, 31); // 23년 8월 31일로 설정
    date.add(Calendar.DATE, 1); // 1일 더함 → 23년 9월 1일
    date.add(Calendar.MONTH, -8); // 8개월 뻄 → 23년 1월 1일

     

    5. roll()

    특정 필드 값을 증가 또는 감소, 다른 필드에 영향없음

    date.set(2023, 7, 31); // 23년 8월 31일로 설정
    date.roll(Calendar.DATE, 1); // 1일 더함 → 23년 8월 1일
    date.roll(Calendar.MONTH, -8); // 8개월 뻄 → 23년 12월 1일

     

    6.  Date와 Calendar간의 변환

    Date 메서드는 deprecated(사용하지 않을 것을 권장)되었지만 여전히 사용되고 있음

    Calendar를 Date로 변환
    Calendar cal = Calendar.getInstance();
    Date d = new Date(cal.getTimeInMillis());
    
    Date를 Calendar로 변환
    Date d = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(d);

    ch 10-9~12 형식화 클래스 DecimalFormat

    1. 형식화 클래스

    java.text 패키지의 DecimalDormat, SimpleDateFormat

    숫자와 날짜를 원하는 형식 문자열로 쉽게 출력 가능

    형식 문자열에서 숫자와 날짜를 뽑아내는 기능

     

    2. DecimalFormat

    숫자(10진수)를 형식 문자열화

    Double num = 1234567.89;
    DecimalFormat df = new DecimalFormat("#.#E0");
    String result = df.format(num);
    // result = "1.2E6"
    기호 의미
    0 10진수(값이 없을 땐 0)
    # 10진수
    E 지수기호

    특정 형식의 문자열을 숫자로 변환

    Integer.parseInt(), Float.parseFloat() 콤마(,)가 포함된 문자열을 숫자로 변환 못함

    DecimalFormat df = new DecimalFormat("#,###.##");
    Number num = df.parse(1,234,567.89);
    double d = num.doubleValue();
    // 1234567.89

    ch 10-13~16 simple date format

    1. SimpleDateFormat

    날짜와 시간을 다양한 형식으로 출력

    Date today = new Date();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
    String result = df.format(today);
    // result = 2023-08-13
    날짜 기호 의미
    G 연대(BC, AD)
    y 년도
    M 월(1~12)
    w 년의 몇 번째 주(1~53)
    W 월의 몇 번째 주(1~5)
    D 년의 몇 번째 일(1~366)
    d 월의 몇 번째 일(1~31)
    F 월의 몇 번째 요일(1~5)
    E 요일

    특정 문자열에서 날짜와 시간으로 변환

    DateFormat df = new SimpleDateFormat("yyyy년 mm월 dd일");
    Date d = df.parse("2015년 11월 23일")// 문자열을 Date로 변환
    
    DateFormat df2 = new SimpleDateFormat(yyyy/mm/dd);
    String result = df2.format(d); // Date를 문자열로 변환
    시간 기호 의미
    a 오전 오후
    H 시간 0~23
    k 시간 1~24
    K 시간 0~11
    h 시간 1~12
    m 분 0~59
    s 초 0~59
    S 천분의 일초 0~999
    z TimeZone
    Z TimeZone
    ' escape문자
    728x90
    댓글