오늘의하루

[자바의 정석] 날짜와 시간, 형식화 정리 본문

JAVA

[자바의 정석] 날짜와 시간, 형식화 정리

오늘의하루_master 2022. 10. 25. 01:01

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초

 

 

Comments