[Java 응용] java.time 패키지 - 3. 날짜 및 시간의 파싱(.parse) & 포맷팅(.format)

Kyung Jae, Cheong·2024년 8월 30일
0
post-thumbnail

0. java.time 패키지

  • Java의 java.time 패키지는 JDK 8부터 도입된 새로운 날짜와 시간 라이브러리로, 기존의 java.util.Datejava.util.Calendar의 문제점을 해결하기 위해 설계되었습니다.

java.time 패키지 포스팅 목차

  1. java.time 패키지 개요
  2. 주요 클래스 목록 및 용도별 분류
  3. 핵심 인터페이스 & 단위 및 필드
  4. 날짜 및 시간의 파싱과 포맷팅

(현재 포스팅) 3. 날짜 및 시간의 파싱과 포맷팅

  • 이번 포스팅에서는 java.time 패키지에서 제공하는 날짜와 시간의 파싱(parsing)과 포맷팅(formatting) 기능에 대해 알아보겠습니다.

  • 주요 내용

  1. DateTimeFormatter 소개
  2. ISO 기준 포맷 및 파싱
  3. 사용자 정의 포맷 및 DateTimeFormatter 패턴

3. 날짜 및 시간의 파싱(.parse) & 포맷팅(.format)

  • java.time 패키지 중 java.time.format패키지에서 날짜와 시간을 파싱(parsing)하고 포맷팅(formatting)하는 DateTimeFormatter 클래스를 제공합니다.
    • Parsing(파싱) : 문자열(String)을 날짜 및 시간 데이터(Date)로 변환
    • Formatting(포맷팅) : 날짜 및 시간 데이터(Date)를 문자열(String)로 변환

3.1. DateTimeFormatter 소개

  • DateTimeFormatterjava.time 패키지에서 날짜와 시간을 문자열로 변환(format)하거나, 문자열을 날짜와 시간 객체로 변환(parse)하는 데 사용되는 클래스입니다.
    • 이 클래스는 다양한 표준 형식을 지원하며, 사용자 정의 패턴을 통해 특정 형식의 날짜와 시간 데이터를 처리할 수 있습니다.
    • DateTimeFormatter는 불변 객체(immutable)로 설계되었으며, 스레드 안전(thread-safe)합니다.
  • 기본 사용 방법
    • DateTimeFormatter를 정의합니다.
      • DateTimeFormatter는 기본적으로 몇 가지 표준 포맷터를 제공하며, 이 포맷터들을 사용하여 날짜와 시간을 포맷팅하거나 파싱할 수 있습니다.
      • 또한, DateTimeFormatter.ofPattern(String pattern) 메서드를 사용하여 사용자 정의 포맷터를 생성할 수 있습니다.
    • Parsing(파싱) : 시간 및 날짜 객체에 .parse(String, DateTimeFormatter)메소드로 적용합니다.
    • Formatting(포맷팅) : 시간 및 날짜 객체에 .format(DateTimeFormatter)메소드로 적용합니다.

3.2. ISO 기준 포맷 및 파싱

  • DateTimeFormatter는 다양한 ISO 표준 포맷터를 제공하며, 이 포맷터들은 대부분의 경우에서 유용하게 사용될 수 있습니다.

ISO 표준이란?

  • ISO(International Organization for Standardization)는 전 세계적으로 통용되는 표준을 개발하고 발행하는 국제 표준화 기구입니다.
    • ISO 표준은 다양한 산업과 분야에서 일관된 품질, 안전성, 효율성을 유지하기 위해 만들어졌으며, IT 및 컴퓨터 과학 분야에서도 널리 적용되고 있습니다.

ISO 8601 표준

  • java.time 패키지에서 자주 사용되는 날짜와 시간 표현 방식은 ISO 8601이라는 국제 표준을 따릅니다.
    • ISO 8601은 날짜와 시간의 표현 형식을 정의하는 표준으로, 다양한 포맷으로 복잡하게 표기되는 날짜와 시간 정보를 일관된 방식으로 표현하기 위해 만들어졌습니다.
  • ISO 8601의 주요 특징
    • 날짜: yyyy-MM-dd 형식으로 표현합니다.
      • 예: 2024-08-29
    • 시간: HH:mm:ss 형식으로 표현합니다.
      • 예: 14:30:45
    • 날짜 및 시간: yyyy-MM-dd'T'HH:mm:ss 형식으로 날짜와 시간을 결합하여 표현합니다.
      • 예: 2024-08-29T14:30:45
    • 시간대: UTC 기준 시간과의 차이를 나타내기 위해 시간 뒤에 Z(Z는 UTC를 나타냄) 또는 +/-HH:mm 형식으로 오프셋을 추가할 수 있습니다.
      • 예: 2024-08-29T14:30:45Z 또는 2024-08-29T14:30:45+09:00
  • ISO 8601 예시
    • 날짜: 2024-08-29 (연-월-일)
    • 시간: 14:30:45 (시:분:초)
    • 날짜와 시간: 2024-08-29T14:30:45 (연-월-일T시:분:초)
    • 날짜와 시간 및 시간대: 2024-08-29T14:30:45+09:00 (연-월-일T시:분:초+시간대)

DateTimeFormatter의 ISO 표준 포맷터

  • DateTimeFormatter.ISO_LOCAL_DATE: yyyy-MM-dd 형식으로 날짜를 포맷팅합니다.
  • DateTimeFormatter.ISO_LOCAL_TIME: HH:mm:ss 형식으로 시간을 포맷팅합니다.
  • DateTimeFormatter.ISO_LOCAL_DATE_TIME: yyyy-MM-dd'T'HH:mm:ss 형식으로 날짜와 시간을 포맷팅합니다.
  • DateTimeFormatter.BASIC_ISO_DATE: yyyyMMdd 형식으로 날짜를 포맷팅합니다.

포맷팅 예시

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDate date = LocalDate.of(2024, 8, 29);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);

String formattedDate = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
String formattedTime = time.format(DateTimeFormatter.ISO_LOCAL_TIME);
String formattedDateTime = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);

System.out.println("Formatted Date: " + formattedDate); // 출력: Formatted Date: 2024-08-29
System.out.println("Formatted Time: " + formattedTime); // 출력: Formatted Time: 14:30:45
System.out.println("Formatted DateTime: " + formattedDateTime); // 출력: Formatted DateTime: 2024-08-29T14:30:45

파싱 예시

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDate date = LocalDate.of(2024, 8, 29);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);

String formattedDate = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
String formattedTime = time.format(DateTimeFormatter.ISO_LOCAL_TIME);
String formattedDateTime = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);

System.out.println("Formatted Date: " + formattedDate); // 출력: Formatted Date: 2024-08-29
System.out.println("Formatted Time: " + formattedTime); // 출력: Formatted Time: 14:30:45
System.out.println("Formatted DateTime: " + formattedDateTime); // 출력: Formatted DateTime: 2024-08-29T14:30:45

3.3. 사용자 정의 포맷 및 파싱

  • DateTimeFormatter는 기본 제공되는 ISO 표준 포맷터 외에도, 사용자 정의 포맷 패턴을 지원합니다.
    • 이를 통해 다양한 형식의 날짜와 시간 데이터를 처리할 수 있습니다.
  • 사용자 정의 포맷 패턴
    • DateTimeFormatter.ofPattern(String pattern) 메서드를 사용하여 사용자 정의 포맷터를 생성할 수 있습니다.
    • 패턴 예시(아래 파트에서 다시 자세히 다룹니다.)
      • "dd/MM/yyyy": 29/08/2024
      • "yyyy/MM/dd HH:mm:ss": 2024/08/29 14:30:45
      • "E, MMM d yyyy": Thu, Aug 29 2024

포맷팅 예시

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDateTime dateTime = LocalDateTime.of(2024, 8, 29, 14, 30, 45);

DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("E, MMM d yyyy HH:mm:ss");
String formattedDateTime = dateTime.format(customFormatter);

System.out.println("Custom Formatted DateTime: " + formattedDateTime); // 출력: Custom Formatted DateTime: Thu, Aug 29 2024 14:30:45

파싱 예시

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

String customDateTimeString = "Thu, Aug 29 2024 14:30:45";

DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("E, MMM d yyyy HH:mm:ss");
LocalDateTime parsedDateTime = LocalDateTime.parse(customDateTimeString, customFormatter);

System.out.println("Parsed DateTime: " + parsedDateTime); // 출력: Parsed DateTime: 2024-08-29T14:30:45

3.4. DateTimeFormatter의 문자열 패턴

  • 모든 기호를 다루기엔 내용이 너무 많아서 주로 쓰이는 것들을 위주로 항목별로 정리해보겠습니다.

기본 패턴 요소

  • 연도 (Year)
    • y: 연도 (최소 자릿수). 예: yyyy → 2024, yy → 24
    • u: 연도 (자릿수 강제). 예: uuuu → 2024
  • 월 (Month)
    • M: 월 (숫자). 예: M → 8, MM → 08
    • MMM: 월 (짧은 이름). 예: MMM → Aug
    • MMMM: 월 (전체 이름). 예: MMMM → August
  • 일 (Day) & 주 (Week)
    • d: 일 (숫자). 예: d → 9, dd → 09
    • D: 연중 일 (1~365/366). 예: D → 241
    • F: 월중 주 (1~5). 예: F → 1 (해당 월의 첫 번째 주)
    • w: 연중 주 (1 ~ 52). 예: w → 27
  • 요일 (Day of Week)
    • E: 요일 (짧은 이름). 예: E → Thu
    • EEEE: 요일 (전체 이름). 예: EEEE → Thursday
  • 오전/오후 (AM/PM)
    • a: 오전/오후 표시. 예: a → PM
  • 시 (Hour)
    • H: 24시간제 시 (0~23). 예: H → 14, HH → 14
    • h: 12시간제 시 (1~12). 예: h → 2, hh → 02
  • 분 (Minute)
    • m: 분 (0~59). 예: m → 7, mm → 07
  • 초 (Second)
    • s: 초 (0~59). 예: s → 5, ss → 05
    • S: 밀리초 (1~9자리). 예: S → 5, SSSS → 5000
  • 시간대 (Time Zone)
    • z: 시간대 이름. 예: z → PDT
    • Z: 시간대 오프셋. 예: Z → -0800
    • X: ISO 8601 시간대. 예: X → -08, XX → -0800, XXX → -08:00

자주 사용되는 패턴 예시

  • 날짜만 표현 (Date)
    • dd/MM/yyyy: 29/08/2024
    • yyyy-MM-dd: 2024-08-29
    • MMMM d, yyyy: August 29, 2024
    • EEE, MMM d, yyyy: Thu, Aug 29, 2024
  • 시간만 표현 (Time)
    • HH:mm:ss: 14:30:45
    • hh:mm a: 02:30 PM
    • hh:mm:ss.SSS a: 02:30:45.123 PM
    • HH:mm:ss z: 14:30:45 PDT
  • 날짜와 시간 표현 (Date and Time)
    • yyyy-MM-dd HH:mm:ss: 2024-08-29 14:30:45
    • yyyy-MM-dd'T'HH:mm:ss: 2024-08-29T14:30:45
    • yyyy/MM/dd HH:mm:ss.SSS: 2024/08/29 14:30:45.123
  • ISO 8601 포맷 (ISO 8601 Formats)
    • yyyy-MM-dd'T'HH:mmXXX: 2024-08-29T14:30+09:00
    • yyyy-MM-dd'T'HH:mm:ssXXX: 2024-08-29T14:30:45+09:00
    • yyyy-MM-dd'T'HH:mm:ss.SSSXXX: 2024-08-29T14:30:45.123+09:00
  • 시간대와 함께 날짜와 시간 표현
    • yyyy-MM-dd HH:mm:ss Z: 2024-08-29 14:30:45 -0800
    • yyyy-MM-dd HH:mm:ss z: 2024-08-29 14:30:45 PST
    • yyyy-MM-dd'T'HH:mm:ss.SSSXXX: 2024-08-29T14:30:45.123+09:00

Java 코드 사용 예시

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.of(2024, 8, 29, 14, 30, 45);

        // 기본 날짜 포맷
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        String formattedDate = dateTime.format(dateFormatter);
        System.out.println("Formatted Date: " + formattedDate); // 출력: Formatted Date: 29/08/2024

        // 기본 시간 포맷
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        String formattedTime = dateTime.format(timeFormatter);
        System.out.println("Formatted Time: " + formattedTime); // 출력: Formatted Time: 14:30:45

        // 사용자 정의 날짜 및 시간 포맷
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("EEEE, MMMM d, yyyy h:mm a");
        String customFormattedDateTime = dateTime.format(customFormatter);
        System.out.println("Custom Formatted DateTime: " + customFormattedDateTime); // 출력: Thursday, August 29, 2024 2:30 PM
    }
}

마무리

  • DateTimeFormatter의 다양한 패턴을 이해하고 활용하면, 날짜와 시간을 원하는 형식으로 포맷팅하거나 파싱할 수 있습니다.
  • 위에서 정리한 주로 사용되는 패턴들을 익히면, 실무에서 더욱 유연하게 날짜와 시간 데이터를 처리할 수 있을 것입니다.
    • 다만 실무에서는 이를 암기하여 사용하기 보단 필요할때 찾아가면서 쓰시는 것을 추천드립니다.
profile
일 때문에 포스팅은 잠시 쉬어요 ㅠ 바쁘다 바빠 모두들 화이팅! // Machine Learning (AI) Engineer & BackEnd Engineer (Entry)

0개의 댓글