본문 바로가기
공부/Java

[Java]Java의 시간 다루기

by happyeuni 2022. 9. 4.
  • GMT : GreenWich Mean Time
    • 영국 그리니치 천문대 기준으로 하는 태양 시간
    • 한국의 타임존은 보통 GMT +09:00 으로 표현됨
  • UTC
    • 지구의 자전 주기의 흐름이 늦어지고 있는 문제를 해결한 시간. GMT를 대체하기 위한 새로운 표준으로 GMT와 아주 미세한 차이인데, 소프트웨어에서 사용할 때는 UTC가 더 정확한 표현
  • ISO 8610
    2021-07-19T17:40:00+09:00
    
    연-월-일시:분:초
  • +/- 시간
  • T : 날짜 뒤에 시간이 오는 것을 표시해 주는 문자
  • : 날짜와 시간 관련된 데이터 교환을 다루는 국제 표준. 국제 표준화 기구(ISO)에 의해 공포되었고, 1988에 처음으로 공개됨
  • JDK 1.8 이전
    • java.util 패키지에 Date 클래스나 Calendar 클래스 사용
    • SimpleDateFomrmat simpleDateFormat = new SimpleDateFormat(”yyyy-MM-dd”);
  • JDK 1.8 이후
    • java.time 패키지가 추가됨
      • java.time : 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공
      • java.time.chrono : 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공
      • java.time.format : 날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공
      • java.time.temporal : 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공
      • java.time.zone : 시간대(time-zone)와 관련된 클래스들을 제공

 

 

LocalDate, LocalTime, LocalDateTime에 대해 더 알아보자

  • 이 세개의 클래스는 모두 타임존 개념을 가지고 있지 않기 때문에 타임존에 따른 시간 변환이 불가능

LocalDate

: 날짜 정보를 위해 사용

LocalDate today = LocalDate.now(); //2022-08-05
LocalDate birthday = LocalDate.of(2000, 1, 11); //2000-01-11
LocalDate christmas = LocalDate.parse("2022-12-25"); //2022-12-25
getYear(); //연도2022
getMonth(); //(Month 열거값나옴 JANUARY, FEBRUARY)
getMonthValue(); //월(1,2,3,...)
getDayOfYear(); //년의 몇 번째 일
getDayOfMonth(); //월의 몇번째 일
getDateOfWeek(); //요일(MONDAY, TUESDAY,...)
isLeapYear(); //윤년여부

 

LocalTime

: 타임존 개념이 필요없는 시간 정보를 나타내기 위해서 사용

LocalTime currentTime = LocalTime.now(); //11:57:33.804
LocalTime timeToGoToBed = LocalTime.of(23, 30, 0); //23:30
getHour()   // 시간
getMinute()    //분
getSecond()   // 초
getNano()    //나노초

 

 

LocalDateTime

: 타임존 개념이 필요없는 날짜와 시간 정보 모두를 나태나기 위해서 사용(LocalDate + LocalTime)

출력 형식 변환

DateTimeFormatter.ofPattern()

LocalDateTime localDateTime = LocalDateTime.of(2021, 1, 1, 0, 0, 0);
String localDateTimeFormat = localDateTime
		.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"));

연산

- plus : plusXX(long XX) - XX만큼 추가

LocalDateTime plusYears(long years) - 인자만큼 년도 추가
LocalDateTime plusMonths(long months) - 인자만큼 달 추가
LocalDateTime plusWeeks(long weeks) - 인자만큼 주 추가
LocalDateTime plusDays(long days) - 인자만큼 일 추가
LocalDateTime plusHours(long hours) - 인자만큼 시간 추가
LocalDateTime plusMinutes(long minutes) - 인자만큼 분 추가
LocalDateTime plusSeconds(long seconds) - 인자만큼 초 추가
LocalDateTime plusNanos(long nanos) - 인자만큼 나노세컨드 추가

 

- minus : minusXX(long XX) - XX만큼 감소

LocalDateTime minusYears(long years) - 인자만큼 년도 감소
LocalDateTime minusMonths(long months) - 인자만큼 달 감소
LocalDateTime minusDays(long days) - 인자만큼 일 감소
LocalDateTime minusWeeks(long weeks) - 인자만큼 주 감소
LocalDateTime minusHours(long hours) - 인자만큼 시간 감소
LocalDateTime minusMinutes(long minutes) - 인자만큼 분 감소
LocalDateTime minusNanos(long nanos) - 인자만큼 나노세컨드 감소
LocalDateTime minusSeconds(long seconds) - 인자만큼초 감소

 

 

- 비교

isAfter() - 인자보다 미래 시간이라면 true 반환
isBefore() - 인자보다 과거 시간이면 true 반환
isEqual() - 인자와 같은 시간이면 true 반환
compareTo()
	compareTo() > 0 : 인자보다 미래 시간
	compareTo() < 0 : 인자보다 과거 시간
	compareTo() == : 인자와 같은 시간
between(startDate,endDate); 
between(startTime,endTime);

 

 

- 변환

LocalDate toLocalDate()
 - 시간 단위(시간, 분, 초, 나노세컨드)가 없는 LocalDate로 반환

LocalDateTime localDateTime = LocalDateTime.now();
localDateTime.toLocalDate();

 

해당 월의 마지막 날짜 찾기

String targetDate = "2020-02-02";

YearMonth targetYearMonth = YearMonth.from(LocalDate.parse(targetDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")));

//해당 월의 일 수(int)
System.out.println(targetYearMonth.lengthOfMonth()); // 29

//해당 월의 마지막 날(LocalDate)
System.out.println(targetYearMonth.atEndOfMonth()); // 2020-02-29

해당 주차의 날짜 찾기

final long calendarWeek = 34; //34주차 입력
LocalDate desiredDate = LocalDate.now()
            .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, calendarWeek)
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
//결과 : 2020-08-17 
//DayOfWeek.MONDAY = 해당 주차에 월요일

댓글