Post

날짜와 시간 & 형식화

Date 와 Calendar

자바에서 날짜와 시간을 다루는 클래스 : Date(JDK 1.0), Calendar(JDK 1.1)

Date 클래스의 대부분의 함수는 Deprecated 되어있어 사용하지 않는 것을 권장한다.

객체 생성

사용하려면 java.util 패키지를 import 해야한다.

  1. Date 클래스 객체 생성

    1
    
     Date date = new Date();
    
  2. Calendar 클래스 객체 생성

    1
    
     Calendar calendar = Calendar.getInstance();
    

Calendar 클래스는 추상 클래스로 직접 객체를 생성할 수 없다. 그래서 Calendar 클래스의 구현체로 객체를 생성해야 하는데 new 키워드를 사용하지 않고 getInstance 메서드를 사용하면 변경사항이 있을 때 getInstance 메서드만 수정하면 되고 참조한 쪽에서는 수정을 하지 않아도 되는 이점이 있다. Calendar 클래스의 구현체로는 GregorianCalendar , BuddhistCalendar , JapaneseImperialCalendar 가 있다.

Date 와 Calendar 간의 변환

  1. Calendar → Date

    1
    2
    
     Calendar calendar = Calendar.getInstance();
     Date date = new Date(calendar.getTimeInMills());
    
  2. Date → Calendar

    1
    2
    3
    
     Date date = new Date();
     Calendar calendar = Calendar.getInstance();
     cal.setTime(d);
    

Calendar 원하는 데이터 조회

Calendar설명비고
YEAR 
MONTH0 ~ 11 (0 = 1월)
DATE 
DAY_OF_MONTH  
DAY_OF_WEEK요일1 ~ 7 (1 = 일요일)
AM_PM오전/오후0 = 오전
1 = 오후
HOUR시간0 ~ 11
HOUR_OF_DAY 0 ~ 23
MINUTE 
SECOND 
MILLISECOND밀리초 
WEEK_OF_YEAR올해의 몇번째 주인지 
WEEK_OF_MONTH이번 달의 몇번째 주인지 
DAY_OF_YEAR올해 중 몇일인지 

이번 달의 마지막 날을 구하는 방법
calendar.getActualMaximum(Calendar.DATE);

특정 필드 조작

1
2
3
4
Calendar today = Calendar.getInstance();
// 일 하루 증가
today.add(Calendar.DATE, 1);
today.roll(Calendar.DATE, 1);

add 메서드와 roll 메서드의 차이점은 roll 메서드는 어떤 필드가 변경될 때 다른 필드에 영향을 미치지 않는다.

단, 예외가 있는데 DATE 필드가 31 일 때 MONTH 필드를 수정하면 DATE 필드가 변경될 수 있다. (예. 31일이 마지막 일인 달에서 다른 달로 변경할 때)

형식화

DecimalFormat : 숫자 형식화

123,456 문자를 123456 정수로 변경하거나 123456 정수를 123,456 문자로 변경하는 등의 작업을 편리하게 할 수 있다.

1
2
3
4
5
6
7
// String -> Integer
DecimalFormat format = new DecimalFormat("#,###");
int number = format.parse("1,234,567").intValue(); // 예외처리 필요(try-catch or throws Exception)

// Integer -> String
DecimalFormat format = new DecimalFormat("#,###");
String strNumber = format.format(123456);

SimpleDateFormat : 날짜 형식화

Date 나 Calendar 객체의 값을 출력하거나 날짜 형식의 문자(2023-12-31)를 Date 나 Calendar 로 변경하는 등의 작업을 편리하게 할 수 있다.

기호의미
y년도
M
d
E요일
a오전/오후
H시(0~23)
h시(1~12)
k시(1~24)
K시(0~11)
m
s
S밀리세컨
특수문자 표현에 사용
1
2
3
4
5
6
7
8
9
// Date 출력
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(format.format(new Date()));
// Calendar 출력
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(format.format(Calendar.getInstance().getTime()));
// 날짜 문자 -> Date 변환
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2023-12-31");

java.time 패키지 (JDK 1.8)

java.time 패키지의 클래스들은 불변성을 가지고 있다. (멀티쓰레드 환경에서 안전)

  • 시간 표현 클래스 : LocalTime
  • 날짜 표현 클래스 : LocalDate
  • 날짜 & 시간 표현 클래스 : LocalDateTime
  • 날짜 & 시간 & 시간대 표현 클래스 : ZonedDateTime
  • 날짜와 시간 초단위 표현 클래스 : Instant
  • 날짜간의 차이 표현 클래스 : Period
  • 시간 차이 표현 클래스 : Durarion

객체 생성

1
2
3
4
5
6
7
8
9
// now()
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();

// of()
LocalDate date = LocalDate.of(2023, 12, 11);
LocalTime time = LocalTime.of(22, 29, 00);
LocalDateTime dateTime = LocalDateTime.of(date, time);

java.time 패키지 클래스를 Calendar 클래스로 변환하는 방법
Calendar calendar = GregorianCalendar.from(ZonedDateTime.now());

날짜와 시간 필드

get 메서드로 원하는 데이터를 조회할 때 사용된다.

TemporalField(ChronoField)설명비고
YEAR 
MONTH_OF_YEAR 
DAY_OF_MONTH 
DAY_OF_WEEK요일1 ~ 7 (1 = 월요일)
AMPM_OF_DAY오전/오후 
HOUR_OF_DAY시간0 ~ 23
CLOCK_HOUR_OF_DAY 1 ~ 24
HOUR_OF_AMPM 0 ~ 11
CLOCK_HOUR_OF_AMPM 1 ~ 12
MINUTE_OF_HOUR 
SECOND_OF_MINUTE 
MILLI_OF_SECOND밀리초 
MICRO_OF_SECOND마이크로초getLong 메서드를 사용해야 함
NANO_OF_SECOND나노초getLong 메서드를 사용해야 함
DAY_OF_YEAR올해 중 몇일인지 

날짜와 시간 단위

with , plus , minus 메서드로 특정 필드를 조작할 때 사용된다.

TemporalUnit(ChronoUnit)설명
YEARS
MONTHS
DAYS
HOURS
MINUTES
SECONDS

형식화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// LocalTime 출력
LocalTime time = LocalTime.now();
System.out.println(time.format(DateTimeFormatter.ofPattern("HH:mm:ss")));

// LocalDate 출력
LocalDate date = LocalDate.now();
System.out.println(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

// LocalDateTime 출력
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

// LocalTime 파싱
LocalTime time = LocalTime.parse("23:59:59");

// LocalDate 파싱
LocalDate date = LocalDate.parse("2023-12-31");

// LocalDateTime 파싱
LocalDateTime dateTime = LocalDateTime.parse("2023-12-31T23:59:59");
This post is licensed under CC BY 4.0 by the author.