[자바] - 날짜와 시간

희운·2025년 11월 29일

LocalDateTime

  • LocalDate: 날짜만 표현할 때 사용한다
    ex) 2013-11-21

  • LocalTime: 시간만을 표현할 때 사용한다. 시, 분, 초를 다룬다.
    ex) 08:20:30.213

  • LocalDateTime: LocalDate 와 LocalTime 을 합한 개념
    ex) 2013-11-21T08:20:30.213


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

	LocalDate nowDate = LocalDate.now();
	LocalDate ofDate = LocalDate.of(2013, 11, 21); 	
    System.out.println("오늘 날짜 = " + nowDate); 	
    System.out.println("지정 날짜 = " + ofDate);
	//계산(불변)
	LocalDate plusDays = ofDate.plusDays(10); 
    System.out.println("지정 날짜+10d = " + plusDays);
    } 
}

실행결과

오늘 날짜 = 2024-02-09
지정 날짜 = 2013-11-21
지정 날짜+10d = 2013-12-01

생성

  • now() : 현재 시간을 기준으로 생성한다.
  • of(. . .) : 특정 날짜를 기준으로 생성한다. 년, 월, 일을 입력할 수 있다.

계산

  • plusDays(): 특정 일을 더한다. 다양한 plusXxx() 메서드가 존재하다.

모든 날짜는 불변이므로, 변경이 발생하면 새로운 객체를 생성해서 반환한다.

LocalTime

public class LocalTimeMain {
      public static void main(String[] args) {
      
        LocalTime nowTime = LocalTime.now();
        LocalTime ofTime = LocalTime.of(9, 10, 30);
		System.out.println("현재 시간 = " + nowTime); 
        System.out.println("지정 시간 = " + ofTime);

 	    LocalTime ofTimePlus = ofTime.plusSeconds(30);
        System.out.println("지정 시간+30s = " + ofTimePlus);

	} 
}

실행결과

현재 시간 = 11:52:51.219602 
지정 시간 = 09:10:30
지정 시간+30s = 09:11:00

LocalTime가 항상 나와야 하는건 아니다

LocalDateTime

LocalDateTime 클래스


public class LocalDateTime {
    private final LocalDate date;
    private final LocalTime time;
    ...
}
package time;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class LocalDateTimeMain {
public static void main(String[] args) {

	LocalDateTime nowDt = LocalDateTime.now();
	
	LocalDateTime ofDt = LocalDateTime.of(2016, 8, 16, 8, 10, 1); 
	System.out.println("현재 날짜시간 = " + nowDt); 
	System.out.println("지정 날짜시간 = " + ofDt);
	//날짜와 시간 분리
	LocalDate localDate = ofDt.toLocalDate(); 
	LocalTime localTime = ofDt.toLocalTime(); 
	System.out.println("localDate = " + localDate); 
	System.out.println("localTime = " + localTime);

	//날짜와 시간 합체
	LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
	System.out.println("localDateTime = " + localDateTime);
	//계산(불변)
	LocalDateTime ofDtPlus = ofDt.plusDays(1000); 
	System.out.println("지정 날짜시간+1000d = " + ofDtPlus); 		
    LocalDateTime ofDtPlus1Year = ofDt.plusYears(1); 			
    System.out.println("지정 날짜시간+1년 = " + ofDtPlus1Year);
	//비교
	System.out.println("현재 날짜시간이 지정 날짜시간보다 이전인가? " + nowDt.isBefore(ofDt));
	System.out.println("현재 날짜시간이 지정 날짜시간보다 이후인가? " +
	nowDt.isAfter(ofDt));

	System.out.println("현재 날짜시간과 지정 날짜시간이 같은가? " + nowDt.isEqual(ofDt));
      
      
}

실행 결과

현재 날짜시간 = 2024-02-09T11:54:54.389163 
지정 날짜시간 = 2016-08-16T08:10:01 localDate = 2016-08-16
localTime = 08:10:01
localDateTime = 2016-08-16T08:10:01
지정 날짜시간+1000d = 2019-05-13T08:10:01 
지정 날짜시간+1년 = 2017-08-16T08:10:01 
현재 날짜시간이 지정 날짜시간보다 이전인가? false 
현재 날짜시간이 지정 날짜시간보다 이후인가? true 
현재 날짜시간과 지정 날짜시간이 같은가? false

기간, 시간의 간격 - Duration, Period

시간의 개념은 크게 2가지

  • 특정 시간의 시간(시각)
    • 이 프로젝트는 2013년 8월 16일 까지 완료해야해
    • 다음 회의는 11시 30분에 진행한다.
  • 시간의 간격(기간)
    • 앞으로 4년은 더 공부해야 해
    • 이 프로젝트는 3개월 남았어
    • 라면은 3분 동안 끓어야 해

Period, Duration 은 시간의 간격 을 표현하는데 사용된다.
시간의 간격은 영어로 amount of time(시간의 양)으로 불린다.

Period
두 날짜 사이의 간격을 년, 월, 일 단위로 나타낸다.

  • 이 프로젝트는 3개월 정도 걸릴 것 같아
  • 기념일이 183일 남았어

Duration
두 시간 사이의 간격을 시, 분, 초(나노초) 단위로 나타낸다.

  • 라면을 끓이는 시간은 3분이야
  • 영화 상영 시간은 2시간 30분이야
  • 서울에서 부산까지는 4시간이 걸려

Period

두 날짜 사이의 간격을 년,월,일 단위로 나타낸다.


 public class Period {
      private final int years;
      private final int months;
      private final int days;
}
 package time;
  import java.time.LocalDate;
  import java.time.Period;
  public class PeriodMain {
public static void main(String[] args) { 

	//시간, 분, 초, 나노초 toHours(), toMinutes(), getSeconds(), getNano()
	//생성
	Period period = Period.ofDays(10);
	System.out.println("period = " + period);
	//계산에 사용
	LocalDate currentDate = LocalDate.of(2030, 1, 1);
	LocalDate plusDate = currentDate.plus(period);
	System.out.println("현재 날짜: " + currentDate);
	System.out.println("더한 날짜: " + plusDate);
	//기간 차이
	LocalDate startDate = LocalDate.of(2023, 1, 1);
	LocalDate endDate = LocalDate.of(2023, 4, 2);
	Period between = Period.between(startDate, endDate);
	System.out.println("기간: " + between.getMonths() + "개월 " + between.getDays() + 	"일"); 
    }
}

Period 생성 방법

  • of(): 특정 기간을 지정해서 Period 를 생성한다.
    • of(년, 월, 일)
    • ofDays()
    • ofMonths()
    • ofYears()

계산에 사용

  • 2030 1월 1일에 10일을 더하면 2030년 1월 11일이 된다.라고 표현할 때 특정 날짜에 10일 이라는 기간을 더할수 있다.

기간 차이

  • 2032년 1월 1일과 2023년 4월 2일간의 차이는 3개월 1일이다. 라고 표현할 때 특정 날짜의 차이를 구하면 기간이 된다.
  • Period.between(startDate, endDate) 와 같이 특정 날짜의 차이를 구하면 Period 가 반환된다.

Duration

두 시간 사이의 간격을 시, 분, 초 단위로 나타낸다.


public class Duration {
      private final long seconds;
      private final int nanos;
 }
 

내부에서 초를 기반으로 시, 분, 초를 계산해서 사용한다.

  • 1분 = 60초
  • 1시간 = 3600초

package time;
  import java.time.Duration;
  import java.time.LocalTime;
  public class DurationMain {
	public static void main(String[] args) { 
    //생성
	Duration duration = Duration.ofMinutes(30);
	System.out.println("duration = " + duration);
	LocalTime lt = LocalTime.of(1, 0);
	System.out.println("기준 시간 = " + lt);
	//계산에 사용
	LocalTime plusTime = lt.plus(duration); 
	System.out.println("더한 시간 = " + plusTime);
	//시간 차이
	LocalTime start = LocalTime.of(9, 0);
	LocalTime end = LocalTime.of(10, 0);
	Duration between = Duration.between(start, end);
	System.out.println("차이: " + between.getSeconds() + "초");
	System.out.println("근무 시간: " + between.toHours() + "시간 " +
	between.toMinutesPart() + "분"); 
	}
}

실행 결과

duration = PT30M
기준 시간 = 01:00
더한 시간 = 01:30
차이: 3600초
근무 시간: 1시간 0분

Duration 생성 방법

  • of(): 특정 시간을 지정해서 Duration을 생성한다.
    • of(지정)
    • ofSeconds()
    • ofMinutes()
    • ofHours()

계산에 사용

  • 1:00에 30분을 더하면 1:30이 된다.라고 표현할 때 특정 시간에 30분이라는 시간(시간의 간격)을 더할 수 있다.

시간 차이

  • 9시와 10시의 차이는 1시간이라고 표현할 때 시간의 차이를 구할 수 있다.
  • Duration.between(start, end)와 같이 특정 시간의 차이를 구하면 Duration이 반환된다.

ChronoUnit VS ChrnonoField

  • ChronoUnit → 시간의 간격(기간, 단위) 을 의미.

    • 예: 3일 차이 계산, 2시간 더하기

    • 즉, “기간 단위”

  • ChronoField → 시간 필드의 값 을 읽고 쓸 때 사용.

    • 예: 연도 읽기, 월 읽기, 분 읽기

    • 즉, “연도/월/일/시/분 같은 필드”

ChronoUnit은 단순히 ‘시간의 단위’를 의미하는 것이고,
날짜·시간의 ‘구체적인 필드 값’을 조회하려면 ChronoField를 써야 한다.

1. ChronoUnit — 단위(기간)을 나타낸다

long days = ChronoUnit.DAYS.between(date1, date2);
long hours = ChronoUnit.HOURS.between(time1, time2);

//차이 구하기
LocalTime lt1 = LocalTime.of(1, 10, 0);
LocalTime lt2 = LocalTime.of(1, 20, 0);


//중요
long secondsBetween = ChronoUnit.SECONDS.between(lt1, lt2);
System.out.println("secondsBetween = " + secondsBetween);
long minutesBetween = ChronoUnit.MINUTES.between(lt1, lt2);
System.out.println("minutesBetween = " + minutesBetween);

여기서 DAYS, HOURS 는 필드 값이 아니라 시간 간격 단위일 뿐이다.

  • long minutesBetween = ChronoUnit.MINUTES.between(lt1, lt2);
    • 이 방식은 거의 암기를 할 정도로 잘 알고 있자
    • 몇 분 차이가 나는지 확인하는 API
  • “며칠 차이인지”

  • “몇 시간 차이인지”

  • “몇 분 차이인지”

  • “plusDays(3)”이나 “plusHours(2)” 같은 연산

에 쓰인다.

✔️ 즉, ChronoUnit은 날짜·시간의 "양(수량)"을 다루는 것

2. ChronoField — 날짜·시간 "필드"를 읽고 쓸 때 사용

LocalDateTime now = LocalDateTime.now();

int year = now.get(ChronoField.YEAR);
int month = now.get(ChronoField.MONTH_OF_YEAR);
int minute = now.get(ChronoField.MINUTE_OF_HOUR);
  • 올해가 몇 년인지

  • 이번 달이 몇 월인지

  • 현재 분(minute)이 몇 분인지

  • 요일이 몇 번째 요일인지

이런 “필드 값”을 읽을 때 쓰는 게 ChronoField야.

✔️ 즉, ChronoField는 날짜·시간을 구성하는 각 조각(필드)을 의미하는 것.


날짜와 시간 문자열 파싱과 포맷팅

  • 포맷팅 : 날짜와 시간 데이터를 원하는 포맷의 문자열로 변경 (Date -> String)

  • 파싱: 문자열을 날짜와 시간 데이터로 변경하는 것, (String -> Date)


package time.ex;

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

public class FormattingMain2 {

    public static void main(String[] args) {
    
        //포맷팅 : 날짜와 시간을 문자로
        LocalDateTime now = LocalDateTime.of(2024, 12, 31, 13, 30, 59);

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년MM월dd일 HH시mm분ss초");

        String format = now.format(formatter);

        System.out.println(format);



        //파싱
        String date = "2025년11월29일 09시49분32초";

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy년MM월dd일 HH시mm분ss초");

        LocalDateTime dateTime = LocalDateTime.parse(date, formatter1);

        LocalTime time = dateTime.toLocalTime();

        System.out.println(time);

    }

}




profile
기록하는 공간

0개의 댓글