자바

JAVA 자바 java.time 패키지 / 날짜와 시간을 조작하기 : 빼기와 더하기, 변경하기, 날짜와 시간을 비교하기

알통몬_ 2017. 3. 15. 11:01
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


날짜와 시간을 조작하기

 날짜와 시간 클래스들은 날짜와 시간을 조작하는 메서드와 상대 날짜를 리턴하는 메서드들을 가지고 있습니다.


빼기와 더하기

 아래 표는 날짜와 시간을 빼거나 더하는 메서드들입니다.

클래스               리턴타입              메서드(매개변수)                설명

                                              minusYears(long)               년 빼기       

                                             minusMonths(long)             월 빼기

                                             minusDays(long)                일 빼기

LocalDate          LocalDate             minusWeeks(long)              주 빼기

LocalDateTime    LocalDateTime        plusYears(long)                 년 더하기

ZonedDateTime   ZonedDateTime       plusMonths(long)                월 더하기

                                             plusDays(long)                  일 더하기

                                             plusWeeks(long)                 주 더하기

----------------------------------------------------------------------------

                                             minusHours(long)               시간 빼기 

                                             minusMinutes(long)             분 빼기

                                             minusSeconds(long)             초 빼기

LocalTime         LocalTime             minusNanos(long)             나노초 빼기

LocalDateTime    LocalDateTime       plusHours(long)                시간 더하기

ZonedDateTime   ZonedDateTime      plusMinutes(long)              분 더하기

                                            plusSeconds(long)              초 더하기

                                            plusNanos(long)                나노초 더하기


각 메서드들은 수정된 LocalTime , LocalDateTime , ZonedDateTime을 리턴하기 때문에 도트(.)연산자로  연결해서 순차적으로 호출할 수 있습니다.

예제)

import java.time.LocalDateTime;


public class DateTimeOperationExample {

public static void main(String[] args) {

LocalDateTime now = LocalDateTime.now();

System.out.println("현재시: " + now);

LocalDateTime  targetDateTime = now

.plusYears(1)

.minusMonths(2)

.plusDays(3)

.plusHours(4)

.minusMinutes(5)

.plusSeconds(6);

System.out.println("연산후: " + targetDateTime);

}

}

 




변경하기

날짜와 시간을 변경하는 메서드들

클래스               리턴타입              메서드(매개변수)                    설명

                                              withYear(int)                        년 변경

LocalDate          LocalDate              withMonth(int)                      월 변경

LocalDateTime    LocalDateTime         withDayOfMonth(int)               월의 일 변경

ZonedDateTime   ZonedDateTime        withDayOfYear(int)                 년의 일 변경

                                              with(TemporalAdjuster adjuster)   상대 변경

----------------------------------------------------------------------------

LocalTime         LocalTime             withHour(int)                         시간 변경

LocalDateTime    LocalDateTime       withMinute(int)                        분 변경

ZonedDateTime   ZonedDateTime      withSecond(int)                       초 변경

                                            withNano(int)                          나노초 변경


with() 메서드는 현재 날짜를 기준으로 해의 첫 번째 일 또는 마지막 일, 달의 첫 번째 일 또는 마지막일, 지난 요일 및 돌아오는 요일 등 상대적인 날짜를 리턴합니다. 매개값은 TemporalAdjuster 타입으로 아래 표에 있는 TemporalAdjusters 에 있는 static 메서드를 호출하면 얻을 수 있습니다.


리턴타입                메서드(매개변수)                                 설명

                          firstDayOfYear()                                 이번 해의 첫 번째 일

                          lastDayOfYear()                                 이번 해의 마지막 일

                          firstDayOfNextYear()                            다음 해의 첫 번째 일

                          firstDayOfMonth()                               이번 달의 첫 번째 일

                          lastDayOfMonth()                               이번 달의 마지막 일

TemporalAdjuster      firstDayOfNextMonth()                          다음 달의 첫 번째 일 

                         firstInMonth(DayOfWeek dayOfWeek)          이번 달의 첫 번째 요일

                         lastInMonth(DayOfWeek dayOfWeek)           이번 달의 마지막 요일

                         next(DayOfWeek dayOfWeek)                   돌아오는 요일

                         nextOrSame(DayOfWeek dayOfWeek)          돌아오는 요일(오늘 포함)

                         previous(DayOfWeek dayOfWeek)              지난 요일

                         previousOrSame(DayOfWeek dayOfWeek)     지난 요일(오늘 포함)

--------------------------------------------------------------------------  

사용 예제)

import java.time.DayOfWeek;

import java.time.LocalDateTime;

import java.time.temporal.TemporalAdjusters;


public class DateTimeChangeExample {

public static void main(String[] args) {

LocalDateTime now = LocalDateTime.now();

System.out.println("현재: " + now);

LocalDateTime  targetDateTime = null;

//직접 변경

targetDateTime = now

.withYear(2024)

.withMonth(10)

.withDayOfMonth(5)

.withHour(13)

.withMinute(30)

.withSecond(20);

System.out.println("직접 변경: " + targetDateTime);

//년도 상대 변경

targetDateTime = now.with(TemporalAdjusters.firstDayOfYear());

System.out.println("이번 해의 첫 일: " + targetDateTime);

targetDateTime = now.with(TemporalAdjusters.lastDayOfYear());

System.out.println("이번 해의 마지막 일: " + targetDateTime);

targetDateTime = now.with(TemporalAdjusters.firstDayOfNextYear());

System.out.println("다음 해의 첫 일: " + targetDateTime);

//월 상대 변경

targetDateTime = now.with(TemporalAdjusters.firstDayOfMonth());

System.out.println("이번 달의 첫 일: " + targetDateTime);

targetDateTime = now.with(TemporalAdjusters.lastDayOfMonth());

System.out.println("이번 달의 마지막 일: " + targetDateTime);

targetDateTime = now.with(TemporalAdjusters.firstDayOfNextMonth());

System.out.println("다음 달의 첫 일: " + targetDateTime);

//요일 상대 변경

targetDateTime = now.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));

System.out.println("이번 달의 첫 월요일: " + targetDateTime);

targetDateTime = now.with(TemporalAdjusters.next(DayOfWeek.MONDAY));

System.out.println("돌아오는 월요일: " + targetDateTime);

targetDateTime = now.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));

System.out.println("지난 월요일: " + targetDateTime);

}

 

}



==================================================================================================================================

날짜와 시간을 비교하기

날짜와 시간 클래스들이 가족 있는 비교하거나 차이를 구하는 메서드들

클래스                   리턴타입      메서드(매개변수)                                설명

LocalDate                               isAfter(ChronoLocalDate other)           이후 날짜인지 비교

LocalDateTime        boolean      isBefore(ChronoLocalDate other)         이전 날짜인지 비교

                                         isEqual(ChronoLocalDate other)           동일 날짜인지 비교

----------------------------------------------------------------------------

LocalDate              boolean     isAfter(LocalTime other)                   이후 시간인지 비교

LocalDateTime                        isBefore(LocalTime other)                 이전 시간인지 비교

----------------------------------------------------------------------------

LocalDate              Period      until(ChronoLocalDate endDateExclusive)   날짜 차이

----------------------------------------------------------------------------

LocalDate                             until(

LocalTime               long           Temporal endExclusive,                      시간 차이

LocalDateTime                         TemporalUnit unit

                                        )

----------------------------------------------------------------------------

                                        between(

Period                   Period        LocalDate startDateInclusive,                  날짜 차이

                                         LocalDate endDateExclusive

                                        )

----------------------------------------------------------------------------

                                        between(

Duration                 Duration      Temporal startInclusive,                       시간 차이

                                          Temporal endExclusive

                                        )

----------------------------------------------------------------------------

ChronoUnit.YEARS                                                                     전체 년 차이 

ChronoUnit.MONTHS                                                                   전체 달 차이

ChronoUnit.WEEKS                   between(                                        전체 주 차이

ChronoUnit.DAYS                       Temporal temporal1Inclusive.               전체 일 차이

ChronoUnit.HOURS       long         Temporal temporal2Exclusive                전체 시간 차이

ChronoUnit.SECONDS                )                                                 전체 초 차이

ChronoUnit.MILLS                                                                     전체 밀리초 차이

ChronoUnit.NANOS                                                                    전체 나노초 차이

------------------------------------------------------------------------------


Period는 년, 달, 일의 양을 /Duration은 시, 분, 초, 나노초의 양을 나타내느 클래스입니다. 

이 클래스들은 D-day 나 D-time을 구할 때 사용할 수 있습니다. 

아래는 Period 와 Duration 이 제공하는 메서드들입니다.

클래스           리턴타입      메서드(매개변수)         설명

                  int             getYears()               년의 차이             

Period           int             getMonths()             월의 차이

                 int              getDays()               일의 차이

Duration        int              getSeconds()           초의 차이

                 int              getNano()               나노초의 차이

------------------------------------------------------------------------------


그리고 Period 와 Duration의 between() 메서드는 년, 달, 일, 초의 단순 차이를 리턴하고, 

ChronoUnit 열거타입의 between() 메서드는 전체 시간을 기준으로 차이를 리턴합니다. 

예를 들어서 2015년 3월과 2016년 5월의 달의 차이를 구하려 할 때 

Period의 between() 은 2가 되고 ChronoUnit의 between()은 14가 됩니다.


예제)

import java.time.Duration;

import java.time.LocalDateTime;

import java.time.Period;

import java.time.temporal.ChronoUnit;


public class DateTimeCompareExample {

public static void main(String[] args) {

LocalDateTime startDateTime = LocalDateTime.of(2023,  1, 1, 9, 0, 0);

System.out.println("시작일: " + startDateTime);

LocalDateTime endDateTime = LocalDateTime.of(2024,  3, 31, 18, 0, 0);

System.out.println("종료일: " + endDateTime + "\n");

//--------------------------------------------------------------

if(startDateTime.isBefore(endDateTime)) {

System.out.println("진행 중입니다." + "\n");

} else if(startDateTime.isEqual(endDateTime)) {

System.out.println("종료합니다." + "\n");

} else if(startDateTime.isAfter(endDateTime)) {

System.out.println("종료했습니다." + "\n");

}

//--------------------------------------------------------------

System.out.println("[종료까지 남은 시간]");

long remainYear = startDateTime.until(endDateTime, ChronoUnit.YEARS);

long remainMonth = startDateTime.until(endDateTime, ChronoUnit.MONTHS);

long remainDay = startDateTime.until(endDateTime, ChronoUnit.DAYS);

long remainHour = startDateTime.until(endDateTime, ChronoUnit.HOURS);

long remainMinute = startDateTime.until(endDateTime, ChronoUnit.MINUTES);

long remainSecond = startDateTime.until(endDateTime, ChronoUnit.SECONDS);


remainYear = ChronoUnit.YEARS.between(startDateTime, endDateTime);

remainMonth = ChronoUnit.MONTHS.between(startDateTime, endDateTime);

remainDay = ChronoUnit.DAYS.between(startDateTime, endDateTime);

remainHour = ChronoUnit.HOURS.between(startDateTime, endDateTime);

remainSecond = ChronoUnit.SECONDS.between(startDateTime, endDateTime);

System.out.println("남은 해: " + remainYear);

System.out.println("남은 달: " + remainMonth);

System.out.println("남은 일: " + remainDay);

System.out.println("남은 시간: " + remainHour);

System.out.println("남은 분: " + remainMinute);

System.out.println("남은 초: " + remainSecond + "\n");

//--------------------------------------------------------------

System.out.println("[종료까지 남은 기간]");

Period period = Period.between(startDateTime.toLocalDate(), endDateTime.toLocalDate());

System.out.print("남은 기간: " + period.getYears() + "년 ");

System.out.print(period.getMonths() + "달 ");

System.out.println(period.getDays() + "일\n");

//--------------------------------------------------------------

Duration duration = 

      Duration.between(startDateTime.toLocalTime(), endDateTime.toLocalTime());

System.out.println("남은 초: " + duration.getSeconds());

}

}


반응형