simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • controllerTest
  • null
  • 자바
  • 스프링
  • 자바프로그램
  • JVM메모리구조
  • 컨트롤러
  • 자바메모리구조
  • scanner #next() #nextLine()
  • 404
  • 자바프로그래밍
  • 참조타입
  • 참조변수

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

Language/Java

JAVA 라이브러리 - 날짜, 시간 관련 클래스(java.util/java.time..)

2022. 8. 10. 00:01

|  날짜, 시간 관련 클래스

1. 날짜 데이터는 언제 쓸까?

- 날짜 및 시간에 관한 데이터는 아래의 예시와 같이 다양한 웹 or 앱 서비스에서 사용하고 있다. 

- 일반적인 회원가입일자 
- 쇼핑몰의 주문일자
- 그룹웨어 회의일자 및 시간/장소대여일자 
- 모바일앱 특정시간에 알람 
- 등등

2. Java의 날짜 및 시간 관련 클래스

- 날짜 객체는 JDK업데이트 과정에서 Data -> Calender -> LocalDate로 발전하였다.

(1) Date today = new Date();  와 같이 Date 객체만을 사용해서 날짜를 표현

(2) Date today = Calendar.getInstance().getTime(); - Calendar를 통해 싱글톤 방식으로 인스턴스 생성하여 사용

(3) LocalDate today = LocalDate.now(); - Calendar를 보완한 LocalDate를 사용

- JDK8 이후부터는 공식적으로 Calendar는 deprecated(더 이상 사용하지 않는) 객체로 지정되었지만 

  국내의 현실 개발 환경에서는 아직까지 Calendar를 사용하는 경우도 많으며, Date객체만 사용하는 경우도 더러 있다고 한다.

  JAVA 8 이전 (deprecated) JAVA 8 이후
날짜 클래스 java.util의 Data와 Calendar java.time의 LocalDate/ LocalTime/ LocalDateTime
포맷 클래스 SimpleDataFormat DateTimeFormatter
*TimeStamp.of()를 쓰기도 한다.
문제점/보완 Thread-safe X
0부터 시작하는 월 지정 인덱스
Data, Calendar 클래스 사용의 혼란 
Thread-safe O
월이 1, 2, 3...으로 시작한다

isBefore(), isAfter()와 같은 메소드 추가

 

|  Date와 Calendar  사용

- Calendar의 단점 중에 하나가 월을 0부터 표현한다는 것이었다.

- 아래 코드를 보면 알 수 있겠지만, 연도나 일은 그럼에도 1부터 시작하는 걸 볼 수 있다.

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class CalendarTest {
    public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd E요일 HH:mm:ss:SSS");

        Date today = Calendar.getInstance().getTime();
        System.out.println(simpleDateFormat.format(today));

        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DATE);
        System.out.printf("%d년 %d월 %d일\n", year, month, day); // 월이 0부터 시작
        month += 1;
        System.out.printf("%d년 %d월 %d일\n", year, month, day); // 1을 더해주어야 한다.

    }
}

>> 결과

2022-08-10 수요일 00:10:32:924
2022년 7월 10일
2022년 8월 10일

 

|  LocalDate / LocalTime / LocalDateTime 사용

- 간단하게 생성하는 법, 연/월/일을 얻는 법을 작성해보았다. 

더보기

|  LocalDate를 활용해 달력 출력하기

- 먼저 구하려는 날짜의 LocalDate를 생성하고, lenthOfMonth()로 그 달의 일수를 구한다.

// 해당 달의 일수 구하기 : lengthOfMonth()
LocalDate date = LocalDate.of(2012,12,1);
int lengthOfMonth = date.lengthOfMonth();

- 해당 월의 1일자가 몇 요일인지, getDayOfWeek().getValue()로 구한다.

int dayOfWeek = date.getDayOfWeek().getValue(); //월화수목.. = 1234..

- 주차를 구하는 방법은 임의로 만들었는데, (전체월 일수 + (7 - 1일자 요일번호))를 7로 나누어 반올림하였다.

int weeksOfMonth = Math.round((lengthOfMonth + (7 - dayOfWeek))/7f);

- 이 세가지를 구한 후, 2차원 배열을 만들고, 1일자의 시작 요일에 맞춰 입력 후, 출력은 이중 for문으로 했다.

- 전체 코드

- 출력 결과  *한글와 숫자깨짐은 무시한 결과다.

[달력 출력 프로그램]
달력의 년도를 입력해 주세요.(yyyy):2022
달력의 월을 입력해 주세요.(mm):7
[2022년 07월]
일 월 화 수 목 금 토  
               01 02 
03 04 05 06 07 08 09 
10 11 12 13 14 15 16 
17 18 19 20 21 22 23 
24 25 26 27 28 29 30

 

|  Date -> LocalDateTime 또는 LoalDateTime -> Date로 변환 

- JDK8부터 Date객체에 from() 메소드가 추가되어 LocalDateTime -> Date로 변환이 가능해졌다.

- Date -> LocalDateTime

LocalDateTime.ofInstant(date.toInstant(), /* ZoneId */);

- LocalDateTime -> Date

Date.from(local.atZone(/*ZoneId*/).toInstant())

 

- atZone()을 넣는 것은 시간대를 구분하기 위해서 넣는 것이다. (아래는 컴퓨터의 시간대 적용)

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

public class LocalDateTest {
    public static void main(String[] args) {

        // A. Date와 LocalDateTime으로 현재시각 구하기
        // (1) Date 타입의 날짜
        Date date = Calendar.getInstance().getTime();
        // (2) LocalDateTime 타입의 날짜
        LocalDateTime localDateTime = LocalDateTime.now();

        // B. LocalDateTime -> Date
        Date localToDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

        // C. Date -> LocalDateTime
        LocalDateTime dateToLocal = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

    }
}

 

 

[ 참고 및 출처 ]

- 부트 캠프 강의를 듣고 정리한 내용입니다.

- 날짜 타입 변환 관련 :  https://recordsoflife.tistory.com/336

- [기본기를 쌓는 정아마추어 코딩블로그:티스토리], https://jeong-pro.tistory.com/163 

- [슬기로운 개발생활:티스토리] https://dev-coco.tistory.com/31

- [삼바:티스토리], https://samba-java.tistory.com/18

'Language > Java' 카테고리의 다른 글

JAVA 라이브러리 - 컬렉션  (0) 2022.08.11
JAVA 라이브러리 - 제네릭 클래스  (0) 2022.08.10
JAVA 라이브러리 - Java.lang 패키지  (0) 2022.08.08
객체지향 언어의 특징 4_캡슐화 (정보 은닉)  (0) 2022.07.22
객체지향 언어의 특징 3_다형성 (사용 편의성)  (0) 2022.07.22
    'Language/Java' 카테고리의 다른 글
    • JAVA 라이브러리 - 컬렉션
    • JAVA 라이브러리 - 제네릭 클래스
    • JAVA 라이브러리 - Java.lang 패키지
    • 객체지향 언어의 특징 4_캡슐화 (정보 은닉)
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바