프로그래밍 일기 — 날짜와 시간
컴퓨터에서 시간 가지고 놀기
#날짜, #시간, #Java.time, #패키지, #LocalDateTime, #DateTimeFormatter
현실에서 인간이 느낄 수 있는 차원에는 두 가지가 있다. 하나가 공간이고 다른 하나는 시간이다. 공간은 비행기, 차, 버스 등 여러 운송수단을 통해 이동할 수 있지만, 시간은 한번 흐르면 절대 되돌릴 수 없다. 시간은 그 만큼 인간에게 있어 매우 중요하다. 한번 소모하면 다시 돌아오지 않기 때문이다.
인간이 컴퓨터를 포함한 모든 기계를 발명한 이후에도 이 사실은 변하지 않는다. 특히 1분 1초가 중요한 현대 비즈니스 사회에서는 시간은 역사상 그 어느 때보다 매우 중요한 정보이자 자원이다. 컴퓨터를 이용해 몇 시까지 중요 문서를 보내야하고, 정해진 시기까지 소프트웨어를 업데이트하거나 릴리즈해야하는 시대다. 만약 내 컴퓨터가 표준 시간대에 맞춰져 있지 않거나, 제대로 조정이 안되어 있다면 분명히 문제가 된다. 예를 들어 일을 하던 와중 상사로부터 어떤 문서를 오후 4시 쯤에 전달해 달라고 부탁을 받았는데, 내 컴퓨터의 시간이 1시간 늦게 맞춰져있다면, 이를 확실하게 인지하고 있지 않는한 컴퓨터 상에 보이는 시간대를 믿어버릴 수 있다. 컴퓨터 표기 시간으로는 분명히 오후 4시에 보냈는데, 실제 시간은 오후 5시에 보낸 것이 된다. 분명 이러한 상황을 원하는 사람은 없을 것이다.
그렇다면 컴퓨터에서는 어떻게 시간을 알아보고 조정할 수 있을까? 프로그래밍에서는 이를 어떻게 활용할 수 있을까?
Java에서의 날짜와 시간
컴퓨터에서는 시간에 맞추어 여러 기능을 제공해야할 때가있다. 예를 들어 사용자가 저녁 8시 이후에는 인터페이스가 검은색으로 바뀌는 Dark Mode를 적용하고 싶다면, 그 시간에 맞추어 인터페이스를 변화시켜야 할 것이다. 프로그래밍 세계에서는 Java를 포함한 프로그래밍 언어에서 날짜와 시간을 처리하는 클래스를 제공한다.
Java.time package활용
Java상에서 날짜와 시간을 이용한 작업을 할 때 유용하게 쓰이는 패키지이다. 패키지는 클래스의 묶음이라고 볼 수 있으며, 클래스 및 인터페이스가 포함될 수 있고, 주로 서로 관련이 있는 클래스끼리 묶어 놓기 때문에 관리 및 참조가 쉽다.
아래는 해당 패키지를 활용해 시간 정보를 출력 및 입력하는 예제이다. .now()
매서드를 통해 현재 시간 정보를 가져올 수 있고, .of()
매서드를 통해 현재 시간 정보를 입력할 수 있다. LocalDate
및 LocalTime
클래스는 이 패키지에서 제공하는 가장 기본적인 클래스들이.
// 날짜와 시간 예제
// java.time package를 가져온다.
import java.time.*;
// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
System.out.println("---- now()를 활용하여 생성 ----");
LocalDate date = LocalDate.now(); // .now() 매서드를 통해 현재 로컬 날짜 정보 가져오기
LocalTime time = LocalTime.now(); // .now() 매서드를 통해 현재 로컬 시간정보 가져오기
LocalDateTime dateTime = LocalDateTime.now(); // .now() 매서드를 통해 현재 로컬 날짜와 시간 정보 가져오기
System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
System.out.println("---- of()를 활용하여 생성 ----");
LocalDate newDate = LocalDate.of(2023, 06, 23); // .of() 매서드를 통해 현재 로컬 날짜 정보 입력하기
LocalTime newTime = LocalTime.of(12, 40, 55); // .of() 매서드를 통해 현재 로컬 시간정보 입력하기
System.out.println(newDate);
System.out.println(newTime);
}
}
>>
---- now()를 활용하여 생성 ----
2023-06-22 // LocalDate.now()
12:41:30.709203 // LocalTime.now()
2023-06-22T12:41:30.709216 // LocalDateTime.now()
---- of()를 활용하여 생성 ----
2023-06-23 // LocalDate.of(년, 월, 일)
12:40:55 // LocalDate.of(시, 분, 초)
위 예제에서 각 클래스마다 출력되는 형식이 조금 씩 다른 것을 알 수 있다. 만약 출력 시간 정보의 형식을 통일 시켜야한다면, 포맷을 조정할 필요가 있다. 시간 정보는 아래 예제와 같이 포맷팅할 수 있다. LocalDate.now()
만 활용했을 때와는 달리 오전(AM)/오후(PM) 시간을 볼 수 있어 좀 더 직관적이다.
// 날짜와 시간 포맷팅 예제
// 필요한 java.time 패키지 가져오기
import java.time.*; // LocalTime 클래스를 가져오기 위함
import java.time.format.*; // DateTimeFormatter 클래스를 가져오기 위함
// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
// DateTimeFormatter 클래스를 활용하여 시간 정보 포맷팅
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
// .format()매서드로 현재 시간 포맷팅 (shortFormat 스타일 활용)
String shortFormat = formatter.format(LocalTime.now());
System.out.println(shortFormat);
}
}
>>
12:51 PM
또한 위 예제에서는 DateTimeFormatter
클래스의 shortFormat
포맷으로 출력했으나 필요에 따라 여러 다른 종류의 포맷 스타일을 활용할 수 있다. 직접 형식을 지정하여 포맷팅하고 싶다면 아래와 같이 newFormatter
를 활용해 볼 수 있다. DateTimeFormatter
클래스의 ofPattern()
매서드를 활용해 원하는 포맷을 출력할 수 있다. 더 많은 포맷 스타일에 대한 정보는 아래 참조(2)에서 확인 가능하다.
// 날짜와 시간 포맷팅 예제 2
// 필요한 java.time 패키지 가져오기
import java.time.*; // LocalTime 클래스를 가져오기 위함
import java.time.format.*; // DateTimeFormatter 클래스를 가져오기 위함
// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
// newFormatter를 활용해 원하는 형식 출력하기
DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String myDate = newFormatter.format(LocalDate.now());
System.out.println(myDate);
}
}
>>
2023/06/22 // "yyyy/MM/dd" 형식의 커스텀 포맷 출력
날짜 및 시간 정보를 활용한 연산
날짜와 시간을 바탕으로 계산을 해야 할 경우가 있을 수도 있다. 예를 들어서 여권은 약 4년 마다 발행을 받아야하기 때문에, 내가 여권을 발행받은 시간과 내 현재 시점을 비교하여 얼마나 지났는지를 알고 싶을 수 있다. 아래는 Period
클래스를 활용하여 between()
매서드를 통해 두 시간 시점의 차이를 계산하는 예제이다. getMonths()
매서드를 통해 월단위 시간차를, getDays()
매서드를 통해 일단위 시간차를 알 수 있다. 총 11개월 30일의 차이가 있다는 것을 알 수 있다.
// 날짜 및 시간 연산 예제
import java.time.*;
// 메인 프로그램에서의 활용
public class Main {
public static void main(String[] args) {
LocalDate timeNow = LocalDate.now();
LocalDate timeGetPasstport = LocalDate.of(2021, 6, 23);
Period period = Period.between(timeGetPasstport, timeNow); // between()매서드로 두 시간 시점의 차 계산
System.out.println(period.getMonths()); // getMonths()매서드로 월단위 시간차 계산
System.out.println(period.getDays()); // getDays()매서드로 일단위 시간차 계산
}
}
>>
11 // getMonths()매서드로 얻은 월단위 시간차
30 // getDays()매서드로 얻은 일단위 시간차
참조:
(1) https://pixabay.com/photos/map-geography-continental-date-6784496/
(2) https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html