자바 시간 빼기 - jaba sigan ppaegi

두 날짜 사이의 시간 / 분 / 초의 차이  계산

String dateStart = "11/03/14 09:29:58";
String dateStop = "11/03/14 09:33:43";

// Custom date format
SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");  

Date d1 = null;
Date d2 = null;
try {
    d1 = format.parse(dateStart);
    d2 = format.parse(dateStop);
} catch (ParseException e) {
    e.printStackTrace();
}    

// Get msec from each, and subtract.
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000;         
long diffMinutes = diff / (60 * 1000);         
long diffHours = diff / (60 * 60 * 1000);                      
System.out.println("Time in seconds: " + diffSeconds + " seconds.");         
System.out.println("Time in minutes: " + diffMinutes + " minutes.");         
System.out.println("Time in hours: " + diffHours + " hours."); 

티스토리 뷰

가끔 코드를 짜다보면 

시간과 시간사이의 차이를 구해야할때가 종종 있다.

어렵지는 않지만 할때마다 찾아보면서 만들어서 기록해둔다.

첫번째 방법

//요청시간 String
String reqDateStr = "202104100830";
//현재시간 Date
Date curDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYYMMddHHmm");
//요청시간을 Date로 parsing 후 time가져오기
Date reqDate = dateFormat.parse(reqDateStr);
long reqDateTime = reqDate.getTime();
//현재시간을 요청시간의 형태로 format 후 time 가져오기
curDate = dateFormat.parse(dateFormat.format(curDate));
long curDateTime = curDate.getTime();
//분으로 표현
long minute = (curDateTime - reqDateTime) / 60000;
System.out.println("요청시간 : " + reqDate);
System.out.println("현재시간 : " + curDate);
System.out.println(minute+"분 차이");

두번째 방법

SimpleDateFormat hhmmssSSS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar before = Calendar.getInstance();
System.out.println("BEFORE : " + hhmmssSSS.format(before.getTime()));
try{Thread.sleep(5000);}catch(Exception e) {}
Calendar after = Calendar.getInstance();
System.out.println("AFTER : " + hhmmssSSS.format(after.getTime()));
int diffHour = after.get(Calendar.HOUR_OF_DAY) - before.get(Calendar.HOUR_OF_DAY);
int diffMinute = after.get(Calendar.MINUTE) - before.get(Calendar.MINUTE);
int diffSecond = after.get(Calendar.SECOND) - before.get(Calendar.SECOND);
int diffMillisecond = after.get(Calendar.MILLISECOND) - before.get(Calendar.MILLISECOND);
System.out.println("시 : " + diffHour); System.out.println("분 : " + diffMinute);
System.out.println("초 : " + diffSecond); System.out.println("밀리세컨드 : " + diffMillisecond);

출처 

이전 블로그에서 옮겨온 포스트

Java8 이전까지는 Java에서 날짜 계산은 Calendar를 사용했다. 윤달 체크 같은 것도 해줘서 좋은데, 사용하기 너무 번거로웠다. 그리고 mutable이기 때문에 전혀 예상치 못 하게 값이 변경될 수 있다.

import java.util.Calendar

Calendar rightNow = Calendar.getInstance(); // 현재 시간
rightNow.add(Calendar.DATE, 3); // 3일 뒤
rightNow.add(Calendar.MONTH, -3); // (위에서 바꾼 3일 뒤의) 3달 전

Java8에서 새로 추가된 날짜 관련 클래스들(java.time 패키지)은 조금 나아졌다. 그리고 immutable이기 때문에, thread-safe 하다는 장점도 있다. LocalDateTime

import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); // 현재시간
LocalDateTime threeYearsAfter = now.plusYears(3); // 3년 뒤 - now는 계속 현재시간
LocalDateTime twoDaysAgo = now.minusDays(2); // 2일 전
LocalDateTime twoDaysAndThreeHoursAgo = now.minusDays(2).minusHours(3); // 2일 3시간 전

중요한 차이점은 immutable이기 때문에, 한번 만들어지면 plus/minus를 해도 변하지 않아서 now는 끝까지 처음 시간을 유지한다. 그리고 리턴값으로 변경된 LocalDateTime을 값을 넘겨주기 때문에 계속 메소드 체이닝을 할 수 있어서 코드가 조금은 이뻐진다. Calendar의 경우는 add() 메소드가 void이기 때문에 변수를 계속 불러줘야 했다.

LocalDateTime 클래스는 timezone 정보가 없는 날짜와 시간을 표현할 수 있는 클래스이고, LocalDate와 LocalTime은 각각 날짜만 표현하거나 시간만 표현하는 클래스이다. timezone 정보를 함께 표현하고 싶다면, ZonedDateTime을 사용하면 된다.

Date를 LocalDateTime으로 변경하려면 아래처럼 하면 된다. Date를 Java8에서 추가된 시점(특정 시각) 클래스인 Instant로 변경하고 timezone을 설정하면 변경할 수 있다. ZoneId 역시 timezone을 나타내기 위해 새로 추가된 클래스이다.

LocalDateTime now = new Date()
    .toInstant()
    .atZone(ZoneId.systemDefault())
    .toLocalDateTime() // .toLocalDate(), .toLocalTime() 도 있다.

참고

  • Java – How to add days to current date
  • LocalDateTime
  • LocalDate
  • LocalTime
  • ZonedDateTime
  • Instant
  • ZoneId

  • #java
  • #date
  • #add
  • #sub