본문 바로가기

프로그래밍/Java

Java_날짜와 시간&형식화

① Calendar 클래스

Calendar cal=new Calendar();	//에러, 추상클래스는 인스턴스를 생성할 수 없다.

//getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar cal=Calendar.getInstance();

→ Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

 

 

- Calendar 예제1 : getInstance()와 get메서드 사용법

import java.util.*;

class JavaJungsuk_Calendar_ex10_1 {
    public static void main(String[] args) {
        Calendar today=Calendar.getInstance();
        System.out.println("이 해의 년도: "+today.get(Calendar.YEAR));
        System.out.println("월(0~11, 0:1월): "+today.get(Calendar.MONTH));
        System.out.println("이 해의 몇 째 주: "+today.get(Calendar.WEEK_OF_YEAR));
        System.out.println("이 달의 몇 째 주: "+today.get(Calendar.WEEK_OF_MONTH));
        System.out.println("이 달의 몇 일: "+today.get(Calendar.DATE));
        System.out.println("이 달의 몇 일: "+today.get(Calendar.DAY_OF_MONTH));
        System.out.println("이 해의 몇 일: "+today.get(Calendar.DAY_OF_YEAR));
        System.out.println("요일(1~7, 1:일요일): "+today.get(Calendar.DAY_OF_WEEK));
        System.out.println("이 달의 몇 째 요일: "+todya.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("오전_오후(0:오전, 1:오후): "+today.get(Calendar.AM_PM));
        System.out.println("시간(0~11): "+today.get(Calendar.HOUR));
        System.out.println("시간(0~23): "+today.get(Calendar.HOUR_OF_DAY));
        System.out.println("분(0~59): "+today.get(Calendar.MINUTE));
        System.out.println("초(0~59): "+today.get(Calendar.SECOND));
        System.out.println("1000분의 1초(0~999): "+today.get(Calendar.MILLISECOND));
        //1000분의 1초를 시간으로 표시하기 위해 3600000로 나누었다.(1시간=60*60)
        System.out.println("TimeZone(-12~+12): "+(today.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
        System.out.println("이 달의 마지막 날: "+today.getActualMaximum(Calendar.DATE));
    }
}
결과
이 해의 년도: 2015
월(0~11, 0:1월): 10
이 해의 몇 째 주: 48
이 달의 몇 째 주: 4
이 달의 몇 일: 23
이 달의 몇 일: 23
이 해의 몇 일: 327
요일(1~7, 1:일요일): 2
이 달의 몇 째 요일: 4
오전_오후(0:오전, 1:오후): 1
시간(0~11): 3
시간(0~23): 15
분(0~59): 14
초(0~59): 48
1000분의 1초(0~999): 96
TimeZone(-12~+12): 9
이 달의 마지막 날: 30

→ getInstance()를 통해서 얻은 인스턴스는 기본적으로 현재 시스템의 날짜와 시간에 대한 정보를 담고 있다.

get메서드를 이용해서 원하는 필드의 값을 얻어올 수 있다.

→ 한 가지 주의해야할 것은 get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12가 아닌 0~11이라는 것이다.

 

 

- Calendar 예제2 : set메서드 사용법

import.java.util.*;

class JavaJungsuk_Calendar_ex10_2 {
    public static void main(String[] args) {
        final String[] DAY_OF_WEEK={"", "일", "월", "화", "수", "목", "금", "토"};
        
        Calendar date1=Calendar.getInstance();
        Calendar date2=Calendar.getInstance();
        
        date1.set(2019, 3, 29);
        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 difference=(date2.getTimeInMills()-date1.getTimeInMills())/1000;	//초단위로 변경
        System.out.println("그 날(date1)부터 지금(date2)까지 "+difference+"초가 지났습니다.");
        System.out.println("일(day)로 계산하면 "+difference/(24*60*60)+"일입니다.");
    }
    
    public static String toString(Calendar date) {
        return date.get(Calendar.YEAR)+"년 "+(date.get(Calendar.MONTH)+1)+"월 "+date.get(Calnedar.DATE)+"일 ";
    }
}
결과
date1은 2019년 4월 29일 월요일이고, 
오늘(date2)은 2019년 8월 7일 수요일입니다.
그 날(date1)부터 지금(date2)까지 8640000초가 지났습니다.
일(day)로 계산하면 100일입니다.

→ set메서드를 이용해서 날짜와 시간을 원하는 값으로 변경할 수 있다.

→ 두 날짜 간의 차이를 구하기 위해 두 날짜의 최소단위인 초단위로 변경한 후 그 차이를 구하는 예제이다.

getTimeInMills()는 1/1000초 단위로 값을 반환하기 때문에 초단위로 얻기 위해서는 1000을 나눠 주어야 하고, 

일단위를 얻기 위해서는 24(시간)*60(분)*60(초)*1000으로 나눠야 한다.

 

- Calendar 예제3 : add메서드와 roll메서드 사용법

add() → 다른 필드에 영향O
date.set(2020, 7, 31);	//2020.8.31
date.add(Calendar.DATE, 1);	//DATE에서 1을 더한다.
=>9월 1일로 출력됨.

roll() → 다른 필드에 영향X
date.set(2020, 7, 31);	//202.8.31
date.roll(Calendar.DATE, 1);
=>8월 1일로 출력됨.
import java.util.*;

class JavaJungsuk_Calendar_ex10_4 {
    public static void main(String[] args) {
        Calendar date=Calendar.getInstance();
        date.set(2019, 7, 31);
        
        Sysetm.out.println(toString(date));
        System.out.println("= 1일 후 =");
        date.add(Calendar.DATE, 1);
        System.out.println(toString(date));
        
        System.out.println("= 6달 전 =");
        date.add(Calendar.MONTH, -6);
        System.out.println(toString(date));
        
        System.out.println("= 31일 후(roll) =");
        date.roll(Calendar.DATE, 31);
        System.out.println(toString(date));
        
        System.out.println("= 31일 후(add) =");
        date.add(Calendar.DATE< 31);
        System.out.println(toString(date));
        
    }
    
    public static String toString(Calendar date) {
        return date.get(Calendar.YEAR)+"년 "+(date.get(Calendar.MONTH)+1)+"월 "+date.get(Calendar.DATE)+" 일";
    }
}
결과
2019년 8월 31일
= 1일 후 =
2019년 9월 1일
= 6달 전 =
2019년 3월 1일
= 31일 후(roll) =
2019년 3월 1일
= 31일 후(add) =
2019년 4월 1일

→ add()메서드는 다른 필드에 영향을 주고, roll()메서드는 다른 필드에 영향을 주지 않는다.

 

 

② 형식화 클래스

: 숫자(10진수)를 형식화할 때 사용 (숫자->형식 문자열)

 

- DecimalFormat 예제1

import java.text.*;

class JavaJungsuk_DecimalFormat_ex10_6 {
    public static void main(String[] args) {
        double num=1234567.89;
        String[] pattern= {
            "0",
            "#",
            "0.0",
            "#.#",
            "0000000000.0000",
            "##########.####",
            "#.#-",
            "-#.#",
            "#,###.##",
            "#,####.##",
            "#E0",
            "0E0",
            "##E0",
            "00E0",
            "####E0",
            "#.#E0",
            "0.0E0",
            "0.000000000E0",
            "00.00000000E0",
            "000.0000000E0",
            "#.#########E0",
            "##.########E0",
            "###.#######E0",
            "#,###.##+#;#,###.##-",
            "#.#%",
            "#.#\u2030",
            "\u00A4 #,###",
            "'#'#,###",
            "''#,###",
        };
        
        for(int i=0; i<pattern.length; i++) {
            DecimalFormat dt=new DecimalFormat(pattern[i]);
            System.out.printf("%19s : %s\n", pattern[i], df.format(num));
        }
    }
}
결과
0 : 1234568
# : 1234568
0.0 : 1234567.9
#.# : 1234567.9
0000000000.0000 : 0001234567.8900
##########.#### : 1234567.89
#.#- : 1234567.9-
-#.# : -1234567.9
#,###.## : 1,234,567.89
#,####.## : 123,4567.89
#E0 : .1E7
0E0 : 1E6
##E0 : 1.2E6
00E0 : 12E5
####E0 : 123.5E4
0000E0 : 1235E4
#.#E0 : 1.2E6
0.0E0 : 1.2E6
0.000000000E0 : 1.2345678890E6
00.00000000E0 : 12.34567890E5
000.0000000E0 : 123.4567890E4
#.##########0 : 1.23456789E6
##.#########0 : 1.23456789E6
###.########0 : 1.23456789E6
#,###.##+;#,###.##- : 1,234,567.89+
#.#% : 123456789%
#.#‰ : 1234567890‰
¤#,### : \1,234,568
'#'#,### : #1,234,568
''#,### : '1,234,568

→ 출력형식의 패턴을 작성하여 DecimalFormat인스턴스를 생성한 다음, 출력하고자 하는 문자열로 format메서드를 호출하면 원하는 패턴에 맞게 변환된 문자열을 얻게 된다. 

 

 

- SimpleDateFormat

import java.util.*;
import java.text.*;

class JavaJungsuk_SimpleDateFormat_ex10_10 {
    public static void main(String args[]) {
        String pattern="yyyy/MM/dd";
        DateFormat df=new SimpleDateFormat(pattern);
        Scanner s=new Scaaner(System.in);
        
        Date inDate=null;
        
        System.out.println("날짜를 "+pattern+"의 형래토 입력해주세요.(입력예:2019/12/31)");
        while(s.hasNextLine()){
            try{
                inDate=df.parse(s.nextLine());
                break;
            } catch(Exception e){
                System.out.println("날짜를 "+pattern+"의 형태로 다시 입력해주세요.(입력예:2019/12/31)");
            }
        }
        
        Calendar cal=Calendar.getInstance();
        cal.setTime(inDate);
        Calendar today=Calendar.getInstance();
        long day=(cal.getTimeInMills()-today.getTimeInMills())/(60*60*1000);
        System.out.println("입력하신 날짜는 현재와 "+day+"시간 차이가 있습니다.");
    }
}
결과
C:\jdk1.8\work\ch10>java JavaJungsuk_SimpleDateFormat_ex10_10
날짜를 yyyy/MM/dd의 형태로 입력해주세요.(입력예:2019/12/31)
asdf
날짜를 yyyy/MM/dd의 형태로 다시 입력해주세요.(입력예:2019/12/31)
2019/12/31
입력하신 날짜는 현재와 3935시간 차이가 있습니다.

→ 화면으로부터 날짜를 입력받아서 입력한 날짜와 현재 날짜의 차이를 출력하는 예제이다.

while문과 try-catch문을 이용해서 올바른 형식으로 날짜가 입력될 때까지 반복해서 입력받도록 하였다.